线程间通信的实现 wait()和notify()方法

Java提供了3个非常重要的方法来巧妙地解决线程间的通信问题。这3个方法分别是:wait()、notify()和notifyAll()。它们都是Object类的最终方法,因此每一个类都默认拥有它们。

虽然所有的类都默认拥有这3个方法,但是只有在synchronized关键字作用的范围内,并且是同一个同步问题中搭配使用这3个方法时才有实际的意义。

  • 如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
  • 如果对象调用了notify方法就会通知某个正在等待这个对象的控制权的线程可以继续运行。
  • 如果对象调用了notifyAll方法就会通知所有等待这个对象控制权的线程继续运行。

下面通过一个实例来说明,2个线程,循环交替打印A、B

package com.smart.concurrency.chapter2;

/**
 * @Description 
 * @author gaowenming
 */
public class WaitAndNotifyTest {
    public static final Object obj = new Object();

    public static void main(String[] args) throws Exception {
        Thread t0 = new Thread(new Thread0());

        Thread t1 = new Thread(new Thread1());

        t0.start();
        t1.start();

    }

}

class Thread0 implements Runnable {

    @Override
    public void run() {
        while (true) {
            synchronized (WaitAndNotifyTest.obj) {
                try {
                    Thread.sleep(100);
                    System.out.println("A");
                    WaitAndNotifyTest.obj.notify();
                    WaitAndNotifyTest.obj.wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class Thread1 implements Runnable {

    @Override
    public void run() {
        while (true) {
            synchronized (WaitAndNotifyTest.obj) {
                try {
                    Thread.sleep(100);
                    System.out.println("B");
                    WaitAndNotifyTest.obj.notify();
                    WaitAndNotifyTest.obj.wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

代码中,可以看到2个线程监视的是同一个对象WaitAndNotifyTest.obj,这样才能保证同步操作的有效

A
B
A
B
A
B
A
B
A
B
A
B
时间: 2024-10-07 01:29:40

线程间通信的实现 wait()和notify()方法的相关文章

线程间通信的定义及全局变量的方法

作者:华清远见讲师 多进程和多线程是系统执行多任务机制的重要手段,多任务同时进行自然少不了相互之间的通信工作.下面先将线程间的通信方式总结一下,便于大家对比学习. 首先来说线程间的通信.因为多个线程是共享进程的空间的,所以线程之间的通信比较简单,主要是利用全局变量的方法.全局变量对进程内的的所有线程都是可见的,所以多个线程可以通过操作全局变量达到相互通信的效果.但是这也存在一个问题,就是"资源"的竞争. 这里所说的资源指的就是全局变量,正是因为这种竞争(因为多线程是同时运行的,而我们往

Java线程间通信之wait/notify

Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.先来我们来看下相关定义: wait() :调用该方法的线程进入WATTING状态,只有等待另外线程的通知或中断才会返回,调用wait()方法后,会释放对象的锁. wait(long):超时等待最多long毫秒,如果没有通知就超时返回. notify() : 通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前

Java 如何实现线程间通信?(notify、join、CountdownLatch、CyclicBarrier、FutureTask、Callable )

转自:https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247486499&idx=1&sn=d3f2d6959df7299bfbe2d663f6c4d353&chksm=ebd6330fdca1ba19316e89bedcaab01be8fdb81ba7ba3a9456c51fa28e80b2b1b33265d513ee&mpshare=1&scene=23&srcid=0113bUJHO

经典笔试题:线程通信(使用wait,notify实现线程间通信)

经典笔试题: 1.自定义容器,提供新增元素(add)和获取元素数量(size)方法.2.启动两个线程.线程1向容器中新增10个数据.线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止. package com.gaopeng.programming.test2; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; /** * 练习:使用wait,notif

java多线程系列5-死锁与线程间通信

这篇文章介绍java死锁机制和线程间通信 死锁 死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象. 同步代码块的嵌套案例 public class MyLock { // 创建两把锁对象 public static final Object objA = new Object(); public static final Object objB = new Object(); } public class DieLock extends Thread { private b

【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁

------Java培训.Android培训.iOS培训..Net培训.期待与您交流!----- 一.单例设计模式 单例设计模式的意义: A.保证类在内存中只有一个对象,不提供外部访问方式,构造函数用private修饰. B.提供公共方法(static修饰,类的静态方法),获取类的实例.单例设计模式分为饿汉和懒汉两种模式. 饿汉式&懒汉式 class Test33 { public static void main(String[] args) { Fanjianan.getInstance()

Java笔记七.线程间通信与线程生命的控制

线程间通信与线程生命的控制 一.线程通信方法 Java是通过Object类的wait.notify.notifyAll这几个方法来实现进程键的通信.由于所有的类都是从Object继承的,因此在任何类中都可以直接使用这些方法. wait:告诉当前线程放弃监视器并进入睡眠状态,知道其他线程进入同一监视器并调用notify为止; notify:唤醒同一对象监视器中调用wait的第一个线程.用于类似饭馆有一个空位后通知所有等候就餐的顾客中的第一位可以入座的情况: notifyAll:唤醒同一对象监视器中

多线程-线程间通信

1.多线程-线程间通信-问题演示 多线程间通信:多个线程处理同一资源,但是处理动作却不同. //创建一个资源描述.资源中有name sex.用于存储数据. class Resource{     String name;     String sex; } //需要定义一个输入任务描述.既然是线程任务,必须实现Runnable接口.  class Input implements Runnable{     private Resource r;     Input(Resource r){  

黑马程序员——JAVA基础之Day24 多线程 ,死锁,线程间通信 ,线程组,线程池,定时器。

------- android培训.java培训.期待与您交流! ---------- Lock()实现提供了比使用synchronized方法和语句可获得更广泛的锁定操作. private Lock lock =new ReentrantLock(); 被锁的代码要用   lock.lock()                lock.unlock()    包括.其中用try   ...finally包围 同步:效率低,如果出现同步嵌套,会出现死锁.  但是安全. 死锁问题:两个或者两个以上