线程通信 交替打印数字

本文解决进程的同步问题,并且实现进程交替进行

代码如下

package Test;
//线程通信   交替打印数字

/**
 * wait()进入阻塞,并释放同步监视器
 * notify()唤醒一个wait线程
 * notifyAll唤醒所有的wait线程
 *
 * 只能使用在同步代码块或同步方法中
 */
class Number implements Runnable{
    private int num=1;  //共享数据

    @Override
    public void run() {
        while (true)
            synchronized (this){   //this是一个Number,任意一个对象都可以充当同步监视器
                notify();  //唤醒
                if(num<=100){
                    System.out.println(Thread.currentThread().getName()+"   打印结果   "+num);
                    num++;

                    try {
                        wait(); //调用wait进入阻塞
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else {
                    break;
                }
            }

    }
}
public class CommunicateTest {
    public static void main(String[] args) {
        Number number=new Number();
        Thread t1=new Thread(number);
        Thread t2=new Thread(number);
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();
        t2.start();
    }
}

要点:1.解决线程同步问题,加了一个synchronized代码块,把run方法中要执行的内容包裹起来,注意== 需要传入一个对象作为同步监视器 ==
2.解决线程通信(交互打印):主要使用到了两个方法notify()和wait()。notify方法用来唤醒被wait()阻塞的进程。调用了wait()方法则进入阻塞,并且释放同步监视器

sleep和wait方法的异同

相同点:都会使得线程阻塞
不同点:1.声明的位置不同,Thread类中声明sleep,Object类中声明wait
2.调用要求不同,sleep可以在任何场景下调用,而wait只能在同步代码块或者同步方法中调用
3.关于是否释放同步监视器:sleep不释放,wait释放
== 任何线程进入同步代码块、同步方法之前,必须先获得对于同步监测器的锁定==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值