Thread가 Start되면 Thread가 ThreadPool에 들어오게 되는데 Runnable한 상태에 들어서게 된다. Thread가 종료되면 Dead됐다라고 함
Not Runnable상태는 CPU를 절대 점유할 수 없는 상태 여기에 계속 갈 수 있는 경우가 Java에서는 3가지 메서드일때 하나는 sleep(시간), wait()은 리소스가 한정,여러쓰레드가 있을때 유효한 Thread가 있을 때 까지 기다리게된다-> Not runnable상태로됨 리소스가 유효한 상태가 될때 프로그램에서 notify()를 실행하면 쓰레드 중 하나만 실행상태(Runnable)로 된다.(notifyall()은 전부다) join()을 다른 스레드에 걸면 자기자신은 Not Runnable상태로 빠지고 다른스레드가 exits가 되면 자기자신은 Runnable로 바뀐다.
public class JoinTest extends Thread {
int start;
int end;
int total;
public JoinTest(int start, int end) {
this.start = start;
this.end = end;
}
public void run() {
int i;
for (i = start; i <= end; i++) {
total += i;
}
}
public static void main(String[] args) {
JoinTest jt1 = new JoinTest(1, 50);
JoinTest jt2 = new JoinTest(51, 100);
jt1.start();
jt2.start();
try {
jt1.join();
jt2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
int lastTotal = jt1.total + jt2.total;
System.out.println("jt1.total = " + jt1.total);
System.out.println("jt2.total= " + jt2.total);
System.out.println("합계 : " + lastTotal);
}
}
class Bank {
private int money = 10000;
public void saveMoney(int save) {
int m = getMoney();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
setMoney(m + save);
}
public void minusMoney(int minus) {
int m = getMoney();
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
setMoney(m - minus);
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
class Park extends Thread {
public void run() {
System.out.println("start save");
SyncMain.myBank.saveMoney(3000);
System.out.println("saveMoney(3000) : " + SyncMain.myBank.getMoney());
}
}
class ParkWife extends Thread {
public void run() {
System.out.println("start minus");
SyncMain.myBank.minusMoney(1000);
System.out.println("minusMoney(1000) : " + SyncMain.myBank.getMoney());
}
}
public class SyncMain {
public static Bank myBank = new Bank();
public static void main(String[] args) throws InterruptedException {
Park p = new Park();
p.start();
Thread.sleep(200);
ParkWife pw = new ParkWife();
pw.start();
}
}
이렇게 실행을 한다면
이런식이다 쓰레드가 두개인경우 공유 자원을 사용하고있는데 하나의 쓰레드가 공유 자원을 사용할 때 다른 쓰레드가 공유 자원을 사용할때 공유자원이 변경이 이뤄지면 안된다.
class Bank {
private int money = 10000;
public synchronized void saveMoney(int save) {
int m = getMoney();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
setMoney(m + save);
}
public synchronized void minusMoney(int minus) {
int m = getMoney();
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
setMoney(m - minus);
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
class Park extends Thread {
public void run() {
System.out.println("start save");
SyncMain.myBank.saveMoney(3000);
System.out.println("saveMoney(3000) : " + SyncMain.myBank.getMoney());
}
}
class ParkWife extends Thread {
public void run() {
System.out.println("start minus");
SyncMain.myBank.minusMoney(1000);
System.out.println("minusMoney(1000) : " + SyncMain.myBank.getMoney());
}
}
public class SyncMain {
public static Bank myBank = new Bank();
public static void main(String[] args) throws InterruptedException {
Park p = new Park();
p.start();
Thread.sleep(200);
ParkWife pw = new ParkWife();
pw.start();
}
}
synchronized(참조형 수식) {
수행문;
}