多线程通信(三)多线程通知/等待交叉进行

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

结果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值