Java多线程— —线程的通信
线程通信的例子:使用3个线程打印1-100。线程1,线程2,线程3 交替打印
1 class Windowtest implements Runnable{ 2 private static int num=1; 3 @Override 4 public void run() { 5 while (true){ 6 synchronized (this){ 7 this.notifyAll(); 8 if (num <=100) { 9 try { 10 Thread.sleep(10); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 15 System.out.println(Thread.currentThread().getName() + ":" + num); 16 num++; 17 } else { 18 break; 19 } 20 try { 21 this.wait(); 22 } catch (InterruptedException e) { 23 e.printStackTrace(); 24 } 25 } 26 } 27 } 28 } 29 30 public class Window { 31 public static void main(String[] args) { 32 Windowtest windowtest1=new Windowtest(); 33 Thread t1 =new Thread(windowtest1); 34 Thread t2 =new Thread(windowtest1); 35 Thread t3 =new Thread(windowtest1); 36 37 t1.setName("线程1"); 38 t2.setName("线程2"); 39 t3.setName("线程3"); 40 t1.start(); 41 t2.start(); 42 t3.start(); 43 44 } 45 }

线程1:1 线程3:2 线程2:3 线程3:4 线程1:5 线程2:6 线程3:7 线程1:8 线程2:9 线程3:10 线程1:11 线程2:12 线程3:13 线程1:14 线程2:15 线程3:16 线程1:17 线程2:18 线程3:19 线程1:20 线程2:21 线程3:22 线程1:23 线程2:24 线程3:25 线程1:26 线程2:27 线程3:28 线程1:29 线程2:30 线程3:31 线程1:32 线程2:33 线程3:34 线程1:35 线程2:36 线程3:37 线程1:38 线程2:39 线程3:40 线程1:41 线程2:42 线程3:43 线程1:44 线程2:45 线程3:46 线程1:47 线程2:48 线程3:49 线程1:50 线程2:51 线程3:52 线程1:53 线程2:54 线程3:55 线程1:56 线程2:57 线程3:58 线程1:59 线程2:60 线程3:61 线程1:62 线程2:63 线程3:64 线程1:65 线程2:66 线程3:67 线程1:68 线程2:69 线程3:70 线程1:71 线程2:72 线程3:73 线程1:74 线程2:75 线程3:76 线程1:77 线程2:78 线程3:79 线程1:80 线程2:81 线程3:82 线程1:83 线程2:84 线程3:85 线程1:86 线程2:87 线程3:88 线程1:89 线程2:90 线程3:91 线程1:92 线程2:93 线程3:94 线程1:95 线程2:96 线程3:97 线程1:98 线程2:99 线程3:100
涉及到的三个方法
wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器(锁)
notify():一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就会唤醒优先级高的那个
notifyAll():一旦执行此方法,就会唤醒所有被wait的线程
说明
1.wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中
2.wait(),notify(),notifyAll()三个方法的调用者必须使用在同步代码块或同步方法中的同步监视器
3..wait(),notify(),notifyAll()三个方法是定义在java.lang.Object类中