多執行緒join(),wait(),nitify()運用

leixiongbo發表於2016-08-11
 import javax.swing.event.CellEditorListener;


public class test {
     public static void main(String[] args) {
test1 test1=new test1();
Input input=new Input(test1);
Output output=new Output(test1);
new Thread(input).start();
new Thread(output).start();
}
}




class Input implements Runnable{
private test1 st;
private int sum;//定義一個變數
    public Input(test1 st) {//通過構造方法接受一個TEST物件
// TODO Auto-generated constructor stub
    this.st=st;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
st.put(sum++);//將sun存入陣列,每次存入後sum自增
}
}

}


class Output implements Runnable{
private test1 st;
public Output(test1 st) {
// TODO Auto-generated constructor stub
this.st=st;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
st.get();//迴圈取出元素

}
}
}






class test1{
//資料儲存陣列
private int[] cslls=new int[10]; 
    //inpos表示存入時陣列下標,outpos表示取出時陣列的下標
private int inpos,outpos;
//存放取出資料的數量
private int coun;
//定義一個put()方法向陣列中存入資料
public synchronized void put(int num){
try {
//當放入資料等於陣列長度的時候,執行緒等待
 while (coun==cslls.length) {
    this.wait();
 }
cslls[inpos]=num;
System.out.println("在cslls[inpos]中放入資料-----------------"+cslls[inpos]);
inpos++;//存完資料後讓下標加1;
if(inpos==cslls.length)
inpos=0;//當inpos為陣列長度時候,將其置位0;
coun++;
this.notify();
    
} catch (Exception e) {
// TODO: handle exception
}

}
//定義一個get()方法從陣列中取出資料
public void get(){

try {
//當放入資料等於陣列長度的時候,執行緒等待
 while (coun==cslls.length) {
    this.wait();
 }
    int data=cslls[outpos];
System.out.println("從cslls[inpos]中取出資料"+data);
outpos++;
if (outpos==cslls.length) 
outpos=0;
this.notify();
 
} catch (Exception e) {
// TODO: handle exception
}

}


}



























相關文章