多執行緒通訊(三)多執行緒通知/等待交叉進行
阿新 • • 發佈:2019-01-24
如何向A、B兩個檔案中寫資料並且向A、B中寫資料是交叉進行的,假定向A中寫資料的是A執行緒,向B中寫資料的是B執行緒,那麼可以通過定義一個標識,用來控制A、B執行緒的交叉效果。
定義輸出類
public class FileOutput { // 定義volatile型別的變數,讓多個執行緒能從公共記憶體中直接獲取值 private volatile boolean printA = false; public synchronized void printFileToA(){ try{ while(printA){ wait(); } System.out.println("Print to AAAAAAAA"); printA = true; notifyAll(); } catch (InterruptedException e){ e.printStackTrace(); } } public synchronized void printFileToB(){ try{ while(!printA){ wait(); } System.out.println("Print to BBBBBBBB"); printA = false; notifyAll(); } catch (InterruptedException e){ e.printStackTrace(); } } }
定義執行緒類
public class PrintAThread extends Thread {
private FileOutput fileOutput;
public PrintAThread(FileOutput fileOutput){
this.fileOutput = fileOutput;
}
@Override
public void run(){
fileOutput.printFileToA();
}
}
public class PrintBThread extends Thread { private FileOutput fileOutput; public PrintBThread(FileOutput fileOutput){ this.fileOutput = fileOutput; } @Override public void run(){ fileOutput.printFileToB(); } }
測試
public class Test3 { public static void main(String[] args){ FileOutput fileOutput = new FileOutput(); for(int i = 0; i < 10; i++){ PrintAThread printAThread = new PrintAThread(fileOutput); PrintBThread printBThread = new PrintBThread(fileOutput); printAThread.start(); printBThread.start(); } } }
結果