# Java高级之线程通信 **Repository Path**: fpfgitmy_admin/java-high-concurrent-msg ## Basic Information - **Project Name**: Java高级之线程通信 - **Description**: 线程通信 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 线程的通信 ``` package com.felixfei.study.threads; /** * @describle 两个线程交替打印 1-100 *
* wait():一旦执行此方法,当前线程进入阻塞状态,并释放同步监视器 * notify():一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就会唤醒优先级高的线程 * notifyall():一旦执行次方法,就会唤醒所有被wait的线程 *
* 说明: * 1. 这三个方法必须使用在同步代码快或同步方法中 * 2. 这三个方法的调用者必须是同一个(要么是this,要么是同一个obj)同步监视器,否则会出现异常 * * 异同:sleep()和wait()的异同? * 相同点:一旦执行该方法,都可以使得当前的线程进入阻塞状态 * 不同点:1)两个方法的声明位置不同:Thread类中声明sleep().Object类中声明wait() * 2)调用的要求不同:sleep()可以在任何需要的场景下调用,wait()必须使用在同步代码块中 * 3)关于是否释放同步监视器:如果两个方法都是用在同步代码快或同步方法中国,sleep()不会释放锁,wait()释放锁 * */ class Number implements Runnable { private int number = 0; @Override public void run() { print(); } private void print() { while (true) { synchronized (this) { // 唤醒等待的线程,刚进入的线程握住锁,禁止其他线程进入 notify(); if (number <= 100) { System.out.println(Thread.currentThread().getName() + "打印" + number); number++; try { // 使执行完成的线程释放锁,使其他线程进入 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { break; } } } } } public class ThreadMsg { 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(); } } ``` + wait():一旦执行此方法,当前线程进入阻塞状态,并释放同步监视器 + notify():一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就会唤醒优先级高的线程 + notifyall():一旦执行次方法,就会唤醒所有被wait的线程 + 说明: 1. 这三个方法必须使用在同步代码快或同步方法中 2. 这三个方法的调用者必须是同一个(要么是this,要么是同一个obj)同步监视器,否则会出现异常 + 异同:sleep()和wait()的异同? + 相同点:一旦执行该方法,都可以使得当前的线程进入阻塞状态 + 不同点: 1)两个方法的声明位置不同:Thread类中声明sleep().Object类中声明wait() 2)调用的要求不同:sleep()可以在任何需要的场景下调用,wait()必须使用在同步代码块中 3)关于是否释放同步监视器:如果两个方法都是用在同步代码快或同步方法中国,sleep()不会释放锁,wait()释放锁