Java 线程通信 例子:使用俩个线程打印1-100.线程1 线程2 交替打印
1 package bytezero.threadcommunication; 2 3 /** 4 * 线程通信的例子:使用俩个线程打印1-100.线程1 线程2 交替打印 5 * 6 * 涉及到的三个方法: 7 * wait(); 一旦执行此方法,当前线程就进入了阻塞状态,并释放同步监视器 8 * notify(); 一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就 9 * 唤醒优先级高的线程 10 * notifyAll(); 一旦执行此方法,就会唤醒被wait的所有线程 11 * 12 *说明: 13 * 1.wait();notify(); notifyAll(); 这三个方法必须使用在同步代码块或同步方法中。 14 * 2.wait();notify(); notifyAll();这三个方法调用者必须是同步代码块或同步方法的 15 * 同步监视器,否则会出现 IllegalMonitorStateException异常 16 *3.wait();notify(); notifyAll();这三个方法定义在 java.lang.Object类中。 17 * 18 * 面试题:slepp() 和 wait()的异同? 19 * 1.相同点:一旦执行方法,都可以使得当前线程进入阻塞状态 20 * 2.不同点:1)两个方法声明的位置不同:Thread类中声明sleep(),Object类声明wait() 21 * 2)调用的要求不同:sleep(); 可以在任何需要的场景下调用 22 * wait()必须使用在同步代码块或同步方法中 23 * 3)关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中, 24 * sleep() 不会释放 同步监视器,wait()会释放同步监视器 25 * @author Bytezero1·zhenglei! Email:420498246@qq.com 26 * create 2021-10-18 15:29 27 */ 28 29 class Number implements Runnable{ 30 private int number = 1; 31 private Object obj = new Object(); 32 33 @Override 34 public void run() { 35 while (true){ 36 synchronized (this) { 37 this.notify(); 38 39 if(number <= 100){ 40 try { 41 Thread.sleep(100); 42 } catch (InterruptedException e) { 43 e.printStackTrace(); 44 } 45 46 System.out.println(Thread.currentThread().getName()+":"+number); 47 number++; 48 49 try { 50 //使得调用如下 wait()方法的线程进入阻塞状态 51 wait(); 52 } catch (InterruptedException e) { 53 e.printStackTrace(); 54 } 55 56 }else{ 57 break; 58 } 59 } 60 } 61 62 } 63 } 64 public class CommunicationTest { 65 public static void main(String[] args) { 66 Number number = new Number(); 67 Thread t1 = new Thread(number); 68 Thread t2 = new Thread(number); 69 70 t1.setName("线程1"); 71 t2.setName("线程1"); 72 73 t1.start(); 74 t2.start(); 75 } 76 }
本文来自博客园,作者:Bytezero!,转载请注明原文链接:https://www.cnblogs.com/Bytezero/p/15420971.html