日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JDK5.0新特性系列---11.4线程 Condition

發(fā)布時(shí)間:2024/9/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK5.0新特性系列---11.4线程 Condition 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

*有時(shí)候線程取得lock后需要在一定條件下才能做某些工作,比如經(jīng)典的ProducerConsumer問(wèn)題

*Java 5.0以前,這種功能是由Object類的wait(),notify()notifyAll()等方法實(shí)現(xiàn)的

*5.0里面,這些功能集中到了Condition這個(gè)接口實(shí)現(xiàn)

*/

/**

* 使用Condition的關(guān)鍵技術(shù)點(diǎn)如下:

* 1.通過(guò)LocknewCondition方法創(chuàng)建Condition的對(duì)象

* 2.Conditionawait方法使當(dāng)前線程進(jìn)入等待狀態(tài),并且釋放它占據(jù)的Lock,直到有其他的線程喚醒當(dāng)前線程時(shí),重新占有Lock.

* 3.Conditionsignal方法喚醒其他正在等待該Condition的線程.

*/

public class ConditionTest {

/**

* 籃子程序,這里為了簡(jiǎn)化問(wèn)題,籃子中最多只能有一個(gè)蘋果

* Consumer必須在籃子里有蘋果的時(shí)候才能吃蘋果,否則它必須暫時(shí)放棄對(duì)籃子的鎖定

* 等到Producer往籃子里放了蘋果后再去拿來(lái)吃。

* 否則它也需要暫時(shí)解鎖等Comsumer把蘋果吃了才能往籃子里放蘋果。

*/

public static class Basket{

//

Lock lock = new ReentrantLock();

//根據(jù)鎖產(chǎn)生Condition對(duì)象

Condition produced = lock.newCondition();

Condition consumed = lock.newCondition();

//籃子里的蘋果數(shù),最多為1

int num = 0;

//生產(chǎn)蘋果,往籃子里放

public void produce() throws InterruptedException{

//獲得鎖

lock.lock();

System.out.println("Producer get a lock...");

try{

//判斷是否滿足生產(chǎn)條件

while(num == 1){

//如果有蘋果,則不生產(chǎn),放棄鎖,進(jìn)入睡眠

//等待消費(fèi)者消費(fèi)

System.out.println("Producer sleep...");

consumed.await();

System.out.println("Producer awaked...");

}

//生產(chǎn)蘋果

Thread.sleep(500);

System.out.println("Producer produced an Apple.");

num = 1;

//通知等待produced Condition的線程

produced.signal();

}finally{

lock.unlock();

}

}

//消費(fèi)蘋果,從籃子里取

public void consume() throws InterruptedException{

//獲得鎖

lock.lock();

System.out.println("Consumer get a lock...");

try{

//判斷是否滿足消費(fèi)條件

while(num == 0){

//如果沒(méi)有蘋果,無(wú)法消費(fèi),則放棄鎖,進(jìn)入睡眠

//等待生產(chǎn)者生產(chǎn)蘋果

System.out.println("Consumer sleep...");

produced.await();

System.out.println("Consumer awaked...");

}

//吃蘋果

Thread.sleep(500);

System.out.println("Consumer consumed an Apple.");

num = 0;

//發(fā)信號(hào)喚醒某個(gè)等待consumed Condition的線程

consumed.signal();

} finally {

lock.unlock();

}

}

}

//測(cè)試Basket程序

public static void testBasket() throws Exception{

final Basket basket = new Basket();

//定義一個(gè)producer

Runnable producer = new Runnable(){

public void run() {

try{

basket.produce();

}catch(InterruptedException ex){

ex.printStackTrace();

}

}

};

//定義一個(gè)consumer

Runnable consumer = new Runnable(){

public void run(){

try{

basket.consume();

}catch(InterruptedException ex){

ex.printStackTrace();

}

}

};

//各生產(chǎn)3個(gè)consumerproducer

ExecutorService service = Executors.newCachedThreadPool();

for(int i = 0; i <3; i++){

service.submit(producer);

}

for(int i = 0;i<3;i++){

service.submit(consumer);

}

service.shutdown();

}

public static void main(String... args)throws Exception{

ConditionTest.testBasket();

}

}




本文轉(zhuǎn)自遠(yuǎn)哥博客園博客,原文鏈接:http://www.cnblogs.com/taven/archive/2011/12/17/2291471.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的JDK5.0新特性系列---11.4线程 Condition的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。