多线程-线程的通信

线程的通信

当我们需要多个线程来共同完成一个任务,并且我们希望他们有规律的执行,那么多线程之间需要一些通讯机制,可以协调他们的工作,以此实现多线程共同操作一份数据.


等待唤醒机制

方法名说明
wait()进入等待状态,会释放对同步监视器的调用
notify()唤醒被wait()的线程中优先级最高的一个线程(如果有多个并且优先级相同,则随机唤醒)
notifyAll()唤醒所有被wait()的线程

注:此三个方法的使用必须是在同步代码块或同步方法中

三个方法的调用者必须是同步监视器,且三个方法都在object类中


线程的交替通行
package com.xiaobai.shangguigu.Test;

//线程通信
public class PrintNumber {
    public static void main(String[] args) {
        PrintNumberTest p1 = new PrintNumberTest();
        new Thread(p1, "线程1").start();
        new Thread(p1, "线程2").start();

    }
}

class PrintNumberTest implements Runnable {
    private int number = 1;

    @Override
    public void run() {
        while (true) {
            synchronized (this) {
                this.notify();//唤醒线程
                if (number <= 100) {
                    System.out.println(Thread.currentThread().getName() + ":" + number);
                    number++;
                } else {
                    break;
                }
                try {
                    this.wait();//等待线程
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

wait()和sleep()的区别

相同点:一旦执行,当前线程都会进入阻塞状态

不同点:

  • 声明的位置不通:wait()声明在Object类中,sleep()声明在Thread类中(静态方法)
  • 使用场景不同:wait()只能使用在同步代码块(同步方法)中,sleep()可以在任何需要使用的场景
  • 对"锁"的使用不同:sleep()不会释放同步监视器,而wait()会释放同步监视器
  • 唤醒方式不同:wait()可以被notify唤醒,或时间结束唤醒,而sleep()只能等事件结束后唤醒