1. 程式人生 > >多執行緒通訊(三)多執行緒通知/等待交叉進行

多執行緒通訊(三)多執行緒通知/等待交叉進行

        如何向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();
        }
    }
}

結果