1. 程式人生 > >多線程9--- 線程間非實時通信--鎖的wait與notify

多線程9--- 線程間非實時通信--鎖的wait與notify

tac vol ... 線程停止 urn class open main -a

1.

技術分享圖片
 1 public class ListAdd1 {
 2     private volatile static List list = new ArrayList();
 3     
 4     public void add(){
 5         list.add("hello");
 6     }
 7     
 8     public int size(){
 9         return list.size();
10     }
11     
12     public static void main(String[] args) {
13         final
ListAdd1 list1 = new ListAdd1(); 14 final Object lock = new Object(); 15 Thread t1 = new Thread(new Runnable() { 16 @Override 17 public void run() { 18 synchronized (lock) {//對象鎖 19 try { 20 for (int i = 0; i < 10; i++) {
21 list1.add(); 22 System.out.println(Thread.currentThread().getName()+"添加了一個元素..."); 23 Thread.sleep(100); 24 25 if(list1.size() == 5) { 26 System.out.println("發出喚醒通知..");
27 lock.notify();//不釋放當前線程的鎖lock, 當前線程繼續執行 28 } 29 } 30 } catch (Exception e) { 31 e.printStackTrace(); 32 } 33 } 34 35 } 36 }, "t1"); 37 38 Thread t2 = new Thread(new Runnable() { 39 @Override 40 public void run() { 41 synchronized (lock) { //對象鎖 42 if(list1.size() != 5){ 43 try { 44 lock.wait(); //釋放鎖 45 } catch (InterruptedException e) { 46 e.printStackTrace(); 47 } 48 System.out.println(Thread.currentThread().getName()+"線程停止"); 49 throw new RuntimeException(); 50 } 51 } 52 } 53 }, "t2"); 54 55 t2.start(); //先t2監聽,不等於釋放鎖,被t1拿到,t1加到5發通知,繼續等到執行完, t2開始執行! 56 t1.start(); 57 58 /*t1添加了一個元素... 59 t1添加了一個元素... 60 t1添加了一個元素... 61 t1添加了一個元素... 62 t1添加了一個元素... 63 發出喚醒通知.. 64 t1添加了一個元素... 65 t1添加了一個元素... 66 t1添加了一個元素... 67 t1添加了一個元素... 68 t1添加了一個元素... 69 t2線程停止 70 Exception in thread "t2" java.lang.RuntimeException 71 at com.bjsxt.base.thread06.ListAdd1$2.run(ListAdd1.java:54) 72 at java.lang.Thread.run(Thread.java:744)*/ 73 } 74 }
View Code

多線程9--- 線程間非實時通信--鎖的wait與notify