Thread 동기화: wait()와 notify()

·2022년 11월 5일
0

JAVA객체지향_Thread

목록 보기
6/7

동기화의 효율을 높이기 위해 만들어진 메소드
Object 클래스에 정의, 동기화 블록 내에서만 사용 가능함

*for문을 이용한 스레드 시간지연

for(int i=0;i<100;i++){
	for(int j=1;j<=10000;j++); }

[예제] 정수 1부터 100까지 차례대로 나열(Thread이용)

0. 공유객체 Data

public class Data{
	private boolean status=false;	//wait/notify를 제대로 걸어주기 위함
    private int[]b=new int[100];	//정수 100 배열
    
    public void setData(int a,int i){	//(b배열 값, 인덱스)
    //만약 인덱스번호가 배열길이보다 커진다면 리턴함
    	if(i>b.length) return;
        b[i]=a;	
    }
    public int[] getB{ //b배열 리턴
    	return b;
    }
    //wait,notify를 위함
    public void setStatus(boolean status){
    	this.status=status;
    }
    public boolean getStatus(){
    	return status;
    }
}

1. 큰 틀 만들기(공유객체 : Data)

//AA 스레드
class AA extends Thread{
	//공유객체를 위한 생성자 만들기
    Data data;
    public AA(Data data){
    	this.data=data;
	}
    @Override
    public void run(){
    	//동기화. 인자->공유객체
        synchronized(data){
        	
        }
    }
}
//BB 스레드
class BB extends Thread{
	//공유객체를 위한 생성자 만들기
    Data data;
    public AA(Data data){
    	this.data=data;
	}
    @Override
    public void run(){
    	//동기화. 인자->공유객체
        synchronized(data){
        }
    }
}
//메인메소드
public class Test{
	public static void main(String[]args){
    //공유객체
    Data data = new data();
    //스레드 호출: start();
    new AA(data).start();
    new BB(data).start();
    }
}

2.구현부 작성

//AA 스레드
class AA extends Thread{
	//공유객체를 위한 생성자 만들기
    Data data;
    public AA(Data data){
    	this.data=data;
	}
    @Override
    public void run(){
    	//동기화. 인자->공유객체
        synchronized(data){
        	for(int i=0;i<100;i++){	//정수 1~100까지 값을 배열에 담기
            	data.setData(i+1,i);
            }
            data.setStatus(true);	//모든 for문이 끝나면 boolean을 true로 바꾸어줌
            data.notify();	//다른 스레드의 wait() 호출
        }
    }
}
//BB 스레드
class BB extends Thread{
	//공유객체를 위한 생성자 만들기
    Data data;
    public AA(Data data){
    	this.data=data;
	}
    @Override
    public void run(){
    	//동기화. 인자->공유객체
        synchronized(data){
        	try{		//wait은 InterruptedException 예외를 불러옴
            	if(data.getStatus==false){	//만약 불리언값이 false면 
                	data.wait();	//대기한다
                }
            }catch(InterruptedeException ie){
            	System.out.println(ie.getMessage());
            }//try-catch문 끝 
            //여기부터는 불리언값이 true가 돼서 notify가 wait을 호출한 뒤 문장들임
            //저장된 배열을 호출하는 메소드를 작성
            int[] b = data.getB(); //Data 클래스의 배열b를 리턴하는 getB()메소드를 가져옴
            for(int n:b){	//for문으로 나열
                System.out.print(n+" ");
            }
            System.out.println();
        }
    }
}
//메인메소드
public class Test{
	public static void main(String[]args){
    //공유객체
    Data data = new data();
    //스레드 호출: start();
      while(true){ //무한반복
        new AA(data).start();
        new BB(data).start();
      }
    }
}
profile
웹개발입문자

0개의 댓글