【六】Java多线程之线程通信notify()、wait()、notifyAll()实现tick tock轮流输出

notify()、wait()、notifyAll()这些方法只能在同步化环境中被调用

wait()会释放当前锁,允许其他线程使用对象,让出CPU。

notify()是通知一个线程获取锁

notifyAll()虽然所有的线程都被通知了。但是这些线程都会进行竞争,且只会有一个线程成功获取到锁,在这个线程没有执行完毕之前,其他的线程就必须等待了(只是这里不需要再notifyAll通知了,因为已经notifyAll了,只差获取锁了)

代码需要的结果是tick tock轮流输出

class TickTock {
    synchronized void tick(boolean running,int i){
        if(!running){
            System.out.println("Tick"+i+" running false notify");
            notify();
            return;
        }
        System.out.println("Tick"+i+" ");
        System.out.println("Tick"+i+" running true notify");
        notify();
        try{
            System.out.println("Tick"+i+" wait begin");
            wait();
            System.out.println("Tick"+i+" wait end");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    synchronized void tock(boolean running,int i){
        if(!running){
            System.out.println("Tock"+i+" running false notify");
            notify();
            return;
        }
        System.out.println("Tock"+i+" ");
        System.out.println("Tock"+i+" running true notify");
        notify();
        try{
            System.out.println("Tock"+i+" wait begin");
            wait();
            System.out.println("Tock"+i+" wait end");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
class WaitNotifyThread implements Runnable{
    TickTock tt;
    WaitNotifyThread(TickTock tt){

        this.tt = tt;
    }
    public void run() {
        if(Thread.currentThread().getName().equals("Tick")){
            for(int i = 0;i<5;i++){
                tt.tick(true,i);
            }
            tt.tock(false,-1);

        }else{
            for(int i = 0;i<5;i++){
                tt.tock(true,i);
            }
            tt.tick(false,-1);

        }
    }
}

public class WaitNotify{
    public static void main(String[] args) {
        TickTock tt = new TickTock();
        WaitNotifyThread r1 = new WaitNotifyThread(tt);
        WaitNotifyThread r2 = new WaitNotifyThread(tt);
        Thread t1 = new Thread(r1,"Tick");
        Thread t2 = new Thread(r2,"Tock");

        t1.start();
        t2.start();
        try {
        t1.join();

            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

F:\JDK\jdk1.8.0_91\bin\java.exe "-javaagent:F:\intellij\idea2018\IntelliJ IDEA 2018.1.5\lib\idea_rt.jar=54021:F:\intellij\idea2018\IntelliJ IDEA 2018.1.5\bin" -Dfile.encoding=UTF-8 -classpath F:\JDK\jdk1.8.0_91\jre\lib\charsets.jar;F:\JDK\jdk1.8.0_91\jre\lib\deploy.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\access-bridge-64.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\cldrdata.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\dnsns.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\jaccess.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\jfxrt.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\localedata.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\nashorn.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\ojdbc6.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\sunec.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\sunjce_provider.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\sunmscapi.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\sunpkcs11.jar;F:\JDK\jdk1.8.0_91\jre\lib\ext\zipfs.jar;F:\JDK\jdk1.8.0_91\jre\lib\javaws.jar;F:\JDK\jdk1.8.0_91\jre\lib\jce.jar;F:\JDK\jdk1.8.0_91\jre\lib\jfr.jar;F:\JDK\jdk1.8.0_91\jre\lib\jfxswt.jar;F:\JDK\jdk1.8.0_91\jre\lib\jsse.jar;F:\JDK\jdk1.8.0_91\jre\lib\management-agent.jar;F:\JDK\jdk1.8.0_91\jre\lib\plugin.jar;F:\JDK\jdk1.8.0_91\jre\lib\resources.jar;F:\JDK\jdk1.8.0_91\jre\lib\rt.jar;F:\myeclipseWorkSpace\thread-train\target\classes WaitNotify
Tick0 
Tick0 running true notify
Tick0 wait begin
Tock0 
Tock0 running true notify
Tock0 wait begin
Tick0 wait end
Tick1 
Tick1 running true notify
Tick1 wait begin
Tock0 wait end
Tock1 
Tock1 running true notify
Tock1 wait begin
Tick1 wait end
Tick2 
Tick2 running true notify
Tick2 wait begin
Tock1 wait end
Tock2 
Tock2 running true notify
Tock2 wait begin
Tick2 wait end
Tick3 
Tick3 running true notify
Tick3 wait begin
Tock2 wait end
Tock3 
Tock3 running true notify
Tock3 wait begin
Tick3 wait end
Tick4 
Tick4 running true notify
Tick4 wait begin
Tock3 wait end
Tock4 
Tock4 running true notify
Tock4 wait begin
Tick4 wait end
Tock-1 running false notify
Tock4 wait end
Tick-1 running false notify

Process finished with exit code 0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值