线程通信的理解

该博客介绍了如何使用Java的wait()和notify()方法实现两个线程交替打印1到100。通过同步监视器实现线程间的通信,详细解释了wait(), notify()和notifyAll()的用法以及注意事项,包括它们必须在同步代码块或方法中使用,并且在哪个对象上调用这些方法的重要性。
摘要由CSDN通过智能技术生成

线程通信的理解

package com.tongxin.bean;
/*
* 使用两个线程交替打印 1~100
*
* 涉及的方法:
*       ①wait():是当前线程进入阻塞状态,并释放同步监视器
*       ②notify():唤醒被wait()阻塞的一个线程,如果有多个线程被
*                  阻塞,则先唤醒优先级高的线程
*       ③notifyAll():一旦执行此方法,就会唤醒所有被wait()阻塞的线程
*
*   注意:
*          ①三个方法必须声明在同步代码块或者同步方法中(即在lock中不可使用这三种方法)
*          ②如果是this作为同步监视器,则可以省略this.  如果是其它的,比如 Object的obj
*            则不可省略
* */
public class Communicate {
    public static void main(String[] args) {
        Test t = new Test();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        t1.setName("线程一");
        t2.setName("线程二");
        t1.start();
        t2.start();
    }
}
class Test implements Runnable{
    private int i=1;
    public void run(){
        while(true){
            synchronized(this){
//              线程一被阻塞后,线程二进来,运行notify()方法,
//              把线程一唤醒,而后线程二被阻塞,之后被线程一唤醒
//              如此,便最终执行结束
//              注意:即使线程一醒过来,也无法立即执行,因为此时线程二
//                   "拿着"同步监视器,直到执行了wait(),才会释放
//                   同步监视器,此时线程一才能进来
                notify();         //忽略了this.
                if(i<=100){
                    System.out.println(Thread.currentThread().getName()+" : "+i);
                    i++;
//                  可解释为:线程一到这里被阻塞(打印1)
//                          而后线程二到这里也阻塞(打印2)
//                    两线程都阻塞,所以程序停止运行
//                   要用一个方法来恢复它们的运行状态
                    try {
                        wait();   //忽略了this.
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }

        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值