[스레드]
CS 상식
Thread (진짜로 작업을 하고 있는 친구)
메모리를 할당받은 프로세스에서
실질적인 작업을 수행하는 주체
프로세스
실행중인 프로그램
프로그램 --실행상태--> 프로세스
일(동작)할수있게 메모리(자원)를 할당받은 상태
프로세스가 실행되는 방식
(과거에는) 선점형 방식 : 우선순위 순서대로 자원(메모리)을 할당받아 진행되는 방식
우선순위가 낮으면 오랫동안 실행 되지 않음
사용자가 그 사이에 우선순위가 높은 프로그램을 실행 시키면 그게 먼저 실행됨
-> 기아현상이 발생될 가능성이있었음
시(간)분할 방식 : 시간을 동일하게 배분하여 골고루 실행될수있도록 진행하는 방식
=> 기존의 선점형 방식에서 우선순위 낮아 오-래 기다린 프로세스에게
우선순위를 높여주는 방식
=> OS(운영체제)의 '스케줄러'
day14
package class01;
// 이미 JAVA에서 구현한 Thread 클래스를 가져다가 사용
// 코드를 재사용할 예정
// => 상속
class Th01 extends Thread{ //<<부모 클래스Thread 가 기본 생성자를 가지고 있기 때문에 Th01자식 클래스에서도 super() 이슈가 없음
@Override
public void run() {
for(int i=1; i<=10;i++) {
System.out.println("Thread 01 "+i);
}
}
}
class Th02 extends Thread{
@Override
public void run() {
for(int i=1; i<=10;i++) {
System.out.println("Thread 02 "+i);
}
}
}
public class Test01 {
public static void main(String[] args) {
Th01 t1 = new Th01(); // 생성
// 생성이되면, 즉시 대기상태가 됨
Th02 t2 = new Th02();
t1.start(); // 스레드 객체야, 일해! <<너 일해
t2.start(); // -> run()메서드를 실행시킴 <<너도 일해
//메모리를 먼저 할당 받는 쪽이 먼저 출력이 되는 것 뿐임
//start()로인해 본인이 구현 해 놓은 run()을 수행하게 되고,
// 주어진 run()을 다 수행하게 되면
// 데드상태가 됨
// 스레드 객체들은 현재 독립적으로 일을 수행하고있구나!
/* 웹개발 특
* 5개 남은 상품
* t1(사용자1) -> 장바구니에 3개담음
* t2(사용자2) => 5개를 즉시구매 //<<왜 되요?
*/
// 스레드 생명주기(라이프사이클)
// 생성 -> 대기 -> 수행 -> 데드
// 블록 : 자원(메모리)을 할당받지못하도록 막아둔상태
for(int i =1; i<=10;i++) {
System.out.println(i); //1이 먼저 프린트 되는건 운빨임; 아마 메인에 있어서 높은 확률로 먼저 나오는거
try {
Thread.sleep(1000); //1000 milliseconds == 1 sec
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package class01;
/*
가족 공동 계좌
10000원
가족들은
5000원씩 사용
가족 구성원은 3명
이때, 결제에 실패한 가족의 이름을
console에 출력!
*/
class Family extends Thread {
Account a = new Account();//?????
// thread.start() -> run()메서드가 수행
@Override
public void run() {
super.run();
a.spend();
}
}
class Account {
static int money = 10000; //공동계좌 공유자원
static int spending = 5500;
synchronized void spend() {
if(money >=spending) { //1)스레드가 멤버변수로 Name을 갖고 있다; 2)Thread t1 = new Thread(f,"Name"); <<Name자리이다
System.out.println(Thread.currentThread().getName()+" 결제 성공");
money-=spending;
}
else {
System.out.println(Thread.currentThread().getName()+" 결제 실패");
}
System.out.println("남은 돈 "+money);
}
}
public class Test03 {
public static void main(String[] args) {
Family f = new Family();
Thread t1 = new Thread(f,"홍길동");
Thread t2 = new Thread(f,"아무무");
Thread t3 = new Thread(f,"티모");
t1.start();
t2.start();
t3.start();
}
}
Thread.currentThread().getName() <<== 이걸 보면 알 수 있는 두가지 :
- 1)스레드가 멤버변수로 Name을 갖고 있다;
- 2)Thread t1 = new Thread(f,"Name"); <<Name자리이다
아마 이렇게 생기지 않았을까?
class Thread {
private String name;
Thread() {
this(new Thread(),null);
}
Thread(Thread thread, String name) {
this.name=name;
}
getter,setter
}