当前位置:编程学堂 > 等待并通知

等待并通知

  • 发布:2023-10-03 08:40

什么是等待和通知

java中我们可以使用“同步”来解决线程同步的问题。该关键字可以保证多线程并发情况下的线程安全。

package com.buydeem.share;

public class WaitNotifyDemo1 {
    静态 final 对象锁= new Object();
    静态 整数= 0;

    公共 静态 void main(String [] args) 抛出InterruptedException{
        可运行 可运行 = () -> {
            for (int i = 0; i < 1000; i++) {                 已同步(锁定){
                    数字++ ;
                    System.out.printf("线程:[%s]打印编号:[%d]%n",Thread.currentThread().getName(),number);
}
            }
        };

        线程 t1 =  线程(可运行);
        t1.setName("t1");

        主题t2 =  线程(可运行);
        t2.setName("t2");

        t1.start();
        t2.start();

        t1.join();
        t2.join();
}
}

例如上面的示例代码中,我们使用synchronized关键字来同步线程,最终打印的结果是2000。(如果你不太理解上面的代码,建议不要浪费时间看这篇文章,阅读之前可以先了解synchronized。关注公众号查看《多线程》专题。)

现有问题

上面的例子中,线程安全问题已经解决了,但是还有一个问题没有解决,就是线程之间的协调问题。那么什么是协调问题呢?如果我现在加一个需求,这个需求不仅是为了保证线程安全,也是为了让两个线程交替打印结果。要完成此任务,您必须允许线程进行通信并协调它们的工作。这是之前对协调的定义。

解决方案

对于上面的问题,我们可以使用wait和notify来解决。这里我先给出实现代码,稍后我们再详细分析。

公共  WaitNotifyDemo2 {
    静态 最终对象锁定=  对象();
    静态 整数 = 0;

    公共 静态 空白  main(String[] args) 抛出 InterruptedException {
        可运行可运行 = () -> {             对于 int i = 0; i < 1000; i++) {
                同步(锁定){
                    LOCK.notify();
                    number++;
System.out.printf("线程:[%s]打印编号:[%d]%n",Thread.currentThread().getName(),number);
                     尝试 {
                        LOCK.wait();
                    } catch(已中断例外 e) {
                        e.printStackTrace();
                   }
                }
            }
        };

        线程 t1 =  线程(可运行);
  t1.setName("t1");

                    t1。 t2.setName("t2");

    t1.start();
   t2.start();

   t1.join();
}
}

如上所示修改代码,然后运行代码打印整个结果如下:

相关文章