鎖只能實現互斥,不能實現線程之間的通訊(能夠參看一個線程間通訊的例子http://020618.blog.51cto.com/6098149/1182807),而Condition能夠解決這個問題,即便CPU分給了當前的線程,可是當前的線程能夠讓出CPU,讓其它的相稱執行,當前線程暫停,當其它的線程執行完後,在通知當前的線程,這樣就實現了線程之間的通訊。java
Java5併發庫中的Condition的功能相似在傳統線程技術中的Object.wait()和Object.notify()的功能,在等待Condition時,容許發生「虛假喚醒」,這一般做爲對基礎平臺語義的讓步。對於大多數應用程序,這實際帶來的影響很小,由於Condition應該老是在一個循環中等待,並測試正被等待的狀態聲明。某個實現能夠隨意移除可能的虛假喚醒,但建議應用程序員老是這些虛假喚醒可能發生,所以,老是在下一個循環中等待。程序員
雖然Condition的功能相似在傳統線程技術中的Object.wait()和Object.notify()的功能,可是Condition能夠實現synchronizd實現不了的功能。併發
下面看一個Condition的代碼例子:實現3個線程時間的交替執行,使main線程喚sub2線程,sub2線程喚醒sub3線程,sub3線程喚醒main線程,如此循環50次。代碼以下:ide
- import java.util.concurrent.locks.Condition;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class ThreeConditionCommunication {
- public static void main(String[] args) {
- final Business business = new Business();
- new Thread(
- new Runnable() {
- @Override
- public void run() {
- for(int i=1;i<=50;i++){
- business.sub2(i);
- }
- }
- }
- ).start();
- new Thread(
- new Runnable() {
- @Override
- public void run() {
- for(int i=1;i<=50;i++){
- business.sub3(i);
- }
- }
- }
- ).start();
- for(int i=1;i<=50;i++){
- business.main(i);
- }
- }
- /*
- main線程喚sub2線程,sub2線程喚醒sub3線程,sub3線程喚醒main線程,須要三個條件
- */
- static class Business {
- Lock lock = new ReentrantLock();
- Condition condition1 = lock.newCondition();
- Condition condition2 = lock.newCondition();
- Condition condition3 = lock.newCondition();
- private int shouldSub = 1;//剛開始main線程先執行
- public void sub2(int i){//子線程2
- lock.lock();
- try{
- while(shouldSub != 2){
- try {
- condition2.await();//sub2線程在等待主線程
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- for(int j=1;j<=10;j++){
- System.out.println("sub2 thread sequence of " + j + ",loop of " + i);
- }
- shouldSub = 3;//執行完以後通知sub3線程
- condition3.signal();//通知sub3線程開始執行
- }finally{
- lock.unlock();
- }
- }
- public void sub3(int i){//子線程3
- lock.lock();
- try{
- while(shouldSub != 3){//不應sub3線程執行
- try {
- condition3.await();//sub3線程執行
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- for(int j=1;j<=20;j++){
- System.out.println("sub3 thread sequence of " + j + ",loop of " + i);
- }
- shouldSub = 1;//執行完以後通知main線程
- condition1.signal();//main線程開始執行
- }finally{
- lock.unlock();
- }
- }
- public void main(int i){//主線程
- lock.lock();
- try{
- while(shouldSub != 1){//不應main線程執行
- try {
- condition1.await();//main線程等待
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- for(int j=1;j<=100;j++){
- System.out.println("main thread sequence of " + j + ",loop of " + i);
- }
- shouldSub = 2;//main線程通知sub2線程執行
- condition2.signal();//sub2線程按開始執行
- }finally{
- lock.unlock();
- }
- }
- }
- }
程序運行的結果:oop
上面的代碼是在 一個線程通訊的例子(http://020618.blog.51cto.com/6098149/1182807)的基礎上進行改寫的,感興趣的朋友能夠看一下。測試