1. 程式人生 > >Java Object 對象上的wait(),notify(),notifyAll()方法理解

Java Object 對象上的wait(),notify(),notifyAll()方法理解

imp 線程等待 i++ col etl cpu 階段 單例 rac

第一階段理解(2017-7-27):

Java 將wait(),notify(),notifyAll()方法放在Object對象上,也就是說任何一個對象都可以調用這個方法,這與”任何一個對象都有一個內置鎖,可以用於線程同步“是照應的。因此,當某個線程要釋放cpu爭奪權,讓自己進入等待狀態時,調用 某個鎖(對象)上的wait()方法,也就是讓當前線程等待其它線程調用該鎖上的notify()或notify()方法。線程間通過同步鎖來實現等待與喚醒協作。簡單例子:

 1 package com.lyyc.thread.sample;
 2 
 3 
 4 import
org.junit.Test; 5 6 public class ThreadStateSample { 7 8 @Test 9 public void test() throws Exception { 10 int threadCount=10; 11 Action action=new Action(); 12 Thread[] actions=new Thread[threadCount]; 13 for(int i=0;i<threadCount;i++){ 14 actions[i]=new
Thread(action); 15 actions[i].start(); 16 } 17 18 while(true){ 19 for(Thread t:actions){ 20 System.out.println(t.getName()+":"+t.getState()); 21 } 22 Thread.sleep(2000); 23 synchronized (action.getLock()) { //首先的獲得同步鎖,才能調用該鎖的wait()/notify()/notifyAll()方法
24 action.getLock().notifyAll(); //鎖對象上調用notifyAll(),同誌其它線程進入Runnable狀態 25 } 26 } 27 28 } 29 } 30 31 class Action implements Runnable{ 32 33 public Object lock=new Object(); 34 public Object getLock(){ 35 return lock; 36 } 37 @Override 38 public void run() { 39 try { 40 synchronized (lock) { 41 Thread.sleep(2000); 42 lock.wait(); 43 } 44 } catch (InterruptedException e) { 45 // TODO Auto-generated catch block 46 e.printStackTrace(); 47 } 48 } 49 50 } 51

Java Object 對象上的wait(),notify(),notifyAll()方法理解