Java线程:线程的通信

线程的通信

wait()与notify()和notifyAll()

  • wait():令当前线程挂起并放弃CPU、同步资源并等待,使别的线程可访问并修改共享资源,而当前线程排队等候其他线程调用notify()或notifyAll()方法唤醒,唤醒后等待重新获得对监视器的所有权后才能继续执行。

  • notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待

  • notifyAll():唤醒正在排队等待资源的所有线程结束等待.

注意:

  • 这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则会报java.lang.IllegalMonitorStateException异常。

  • 因为这三个方法必须有锁对象调用,而任意对象都可以作为synchronized的同步锁,因此这三个方法只能在Object类中声明。

wait() 方法

  • 在当前线程中调用方法:对象名.wait()
  • 使当前线程进入等待(某对象)状态,直到另一线程对该对象发出notify(或notifyAll)为止。
  • 调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)
  • 调用此方法后,当前线程将释放对象监控权,然后进入等待
  • 在当前线程被notify后,要重新获得监控权,然后从断点处继续代码的执行。

notify()/notifyAll()方法

  • 在当前线程中调用方法:对象名.notify()

  • 功能:唤醒等待该对象监控权的一个/所有线程。

  • 调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)

示例代码:

public class ThreadCommunication {

    public static void main(String[] args) {
        Number10 n = new Number10();
        Thread t1 = new Thread(n);
        Thread t2 = new Thread(n);
        t1.start();
        t2.start();
    }

}

class Number10 implements Runnable {
    private int num = 0;

    @Override
    public void run() {
        // TODO Auto-generated method stub

        while (true) {
            synchronized (this) {
                notify();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (num < 10) {
                    System.out.printf("%s : num: %d%n", Thread.currentThread().getName(), num++);
                } else {
                    break;
                }

                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

    }

}

输出:

Thread-0 : num: 0
Thread-1 : num: 1
Thread-0 : num: 2
Thread-1 : num: 3
Thread-0 : num: 4
Thread-1 : num: 5
Thread-0 : num: 6
Thread-1 : num: 7
Thread-0 : num: 8
Thread-1 : num: 9
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 2,261评论 0 14
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,529评论 1 15
  • 林炳文Evankaka原创作品。转载自http://blog.csdn.net/evankaka 本文主要讲了ja...
    ccq_inori阅读 688评论 0 4
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 3,022评论 1 18
  • 一、进程和线程 进程 进程就是一个执行中的程序实例,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程。...
    阿敏其人阅读 2,637评论 0 13