new 로 스레드 생성 -> start() -> Runnable 상태-> run()실행-> sleep,suspend,wait 사건발생시 blocked->blocked 상태에서 스레드가 대기 run()중지

 

sleep()메소드 호출하고 다시 runnable 되려면 지정된 시간이 경과 해야한다 .

wait() 는 다른 메소드에게서 notify 메시지를 전송받아야 다시 runnable되고, suspend 에 의해서 일시 중지 된 스레드는 resume를 통해서 재실행합니다. 이러한 시간을 요하는 작업을 반복문 대신 sleep() 메소드로 처리 할수있다.

 

스레드의 우선순위

void setPriority (int newPriority)

setPriority 전달인자로 Thread.MAX_PRIORITY(최대 우선권), Thread.NORM_PRIORITY(보통우선권), Thread.MIN_PRIORITY(최소 우선권) 중 하나의 상수를 지정하여 우선순위를 설정할수있다.

 

근데 보통 스레드 몇개까지 돌리지 ????

package thread;

class testThread extends Thread {
// 생성자 오버로딩 해서 우선순위 부여할라고 ?
testThread() {
}

testThread(String str) {
super(str);
System.out.println(“: ” + getName() + “우선순위” + getPriority());
}

testThread(String str, int Priority) {
super(str);
try {
Thread.sleep(100);

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

setPriority(Priority);

}

public void run() {
int i = 0;
while (i++ < 10) {
System.out.println(i + “: ” + getName() + “우선순위” + getPriority());
}
}

}

public class Threadtest07 {

public static void main(String args[]) {

// public static final int MIN_PRIORITY = 1;
//
// public static final int NORM_PRIORITY = 5;
//
//
// public static final int MAX_PRIORITY = 10;
Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
Thread t1 = new testThread(“첫번때”);
Thread t2 = new testThread(“두번때”, 10);
Thread t3 = new testThread(“세번때”, 1);
System.out.println(Thread.currentThread());
t1.start();
t2.start();
t3.start();

}
}

동기화

멀티스레드에서 하나의 스레드에 의해서만 처리할 수있도록 하는 영역을 임계영역이라 한다.

메소드의 동기화 방법

public synchronized void Method(){

//임계처리 부분

}

 

특정블록의 동기화

public void Method(){

synchronized(동기화할 객체 또는 동기화할 클래스명){

//임계처리 부분

}
}

실습

동기화를 이용한 은행 출금,입금

package thread;

class Atm {
private int money;

public Atm(int m) {
this.money = m;

}

synchronized void deposit(int amount, String name) {

money+=amount;
System.out.println(name+” 입금금액은 :”+amount);

}

synchronized void withdraw(int amount, String name) {
if((money-amount)>0){
money-=amount;

System.out.println(name+” 출금금액은 :”+amount);
}
else{
System.out.println(“출금못함”);
}
}

public void getmoney(String name) {
System.out.println(name+”님의 현재잔액은”+money);
}
}
class AtmUser extends Thread{
boolean flag;
Atm obj;
public AtmUser(Atm obj,String name){
super(name);
this.obj=obj;
}
public void run(){
for (int i = 0; i < 5; i++) {
try {
sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(flag){
obj.deposit((int)(Math.random()*10+2)*100, getName());
obj.getmoney(getName());
}
else{
obj.withdraw((int)(Math.random()*10+2)*100, getName());
obj.getmoney(getName());
}
flag =!flag;
}
}
}

public class Threadtest08 {
public static void main(String args[]){
Atm obj = new Atm(1000);
AtmUser user1 = new AtmUser(obj,”전찬웅”);
AtmUser user2 = new AtmUser(obj,”김남길”);

AtmUser user3 = new AtmUser(obj,”홍근효”);
user1.start();
user2.start();

user3.start();

}
}