동기화의 효율을 높이기 위해 만들어진 메소드
Object 클래스에 정의, 동기화 블록 내에서만 사용 가능함
for(int i=0;i<100;i++){
for(int j=1;j<=10000;j++); }
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;
}
}
//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();
}
}
//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();
}
}
}