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();
}
}
'Java' 카테고리의 다른 글
패키지 - Pakege (0) | 2016.04.29 |
---|---|
메소드 오버라이딩 (0) | 2016.04.29 |
업캐스팅과 다운캐스팅 (0) | 2016.04.29 |
추상클래스 (0) | 2016.04.29 |
WrapperClass – 오토박싱 오토 언박싱 (0) | 2016.04.29 |