newcondition java_Java并发Condition接口
全屏
java.util.concurrent.locks.Condition接口提供一個(gè)線程掛起執(zhí)行的能力,直到給定的條件為真。?Condition對(duì)象必須綁定到Lock,并使用newCondition()方法獲取對(duì)象。
Condition類的方法
以下是Condition類中可用的重要方法的列表。序號(hào)方法名稱描述1public void await()使當(dāng)前線程等待,直到發(fā)出信號(hào)或中斷信號(hào)。
2public boolean await(long time, TimeUnit unit)使當(dāng)前線程等待直到發(fā)出信號(hào)或中斷,或指定的等待時(shí)間過去。
3public long awaitNanos(long nanosTimeout)使當(dāng)前線程等待直到發(fā)出信號(hào)或中斷,或指定的等待時(shí)間過去。
4public long awaitUninterruptibly()使當(dāng)前線程等待直到發(fā)出信號(hào)。
5public long awaitUntil()使當(dāng)前線程等待直到發(fā)出信號(hào)或中斷,或者指定的最后期限過去。
6public void signal()喚醒一個(gè)等待線程。
7public void signalAll()喚醒所有等待線程。
實(shí)例
以下TestThread程序演示了Condition接口的這些方法。這里我們使用signal()通知和await()掛起線程。import?java.util.concurrent.locks.Condition;
import?java.util.concurrent.locks.Lock;
import?java.util.concurrent.locks.ReentrantLock;
public?class?TestThread?{
public?static?void?main(String[]?args)?throws?InterruptedException{
ItemQueue?itemQueue?=?new?ItemQueue(10);
//Create?a?producer?and?a?consumer.
Thread?producer?=?new?Producer(itemQueue);
Thread?consumer?=?new?Consumer(itemQueue);
//Start?both?threads.
producer.start();
consumer.start();
//Wait?for?both?threads?to?terminate.
producer.join();
consumer.join();
}
static?class?ItemQueue?{
private?Object[]?items?=?null;
private?int?current?=?0;
private?int?placeIndex?=?0;
private?int?removeIndex?=?0;
private?final?Lock?lock;
private?final?Condition?isEmpty;
private?final?Condition?isFull;
public?ItemQueue(int?capacity)?{
this.items?=?new?Object[capacity];
lock?=?new?ReentrantLock();
isEmpty?=?lock.newCondition();
isFull?=?lock.newCondition();
}
public?void?add(Object?item)?throws?InterruptedException?{
lock.lock();
while(current?>=?items.length)
isFull.await();
items[placeIndex]?=?item;
placeIndex?=?(placeIndex?+?1)?%?items.length;
++current;
//Notify?the?consumer?that?there?is?data?available.
isEmpty.signal();
lock.unlock();
}
public?Object?remove()?throws?InterruptedException?{
Object?item?=?null;
lock.lock();
while(current?<=?0){
isEmpty.await();
}
item?=?items[removeIndex];
removeIndex?=?(removeIndex?+?1)?%?items.length;
--current;
//Notify?the?producer?that?there?is?space?available.
isFull.signal();
lock.unlock();
return?item;
}
public?boolean?isEmpty(){
return?(items.length?==?0);
}
}
static?class?Producer?extends?Thread?{
private?final?ItemQueue?queue;
public?Producer(ItemQueue?queue)?{
this.queue?=?queue;
}
@Override
public?void?run()?{
String[]?numbers?=?{"1",?"2",?"3",?"4",?"5",?"6",?"7",?"8",?"9",?"10",?"11",?"12"};
try?{
for(String?number:?numbers){
queue.add(number);
System.out.println("[Producer]:?"?+?number);
}
queue.add(null);
}
catch?(InterruptedException?ex)?{
ex.printStackTrace();
}
}
}
static?class?Consumer?extends?Thread?{
private?final?ItemQueue?queue;
public?Consumer(ItemQueue?queue)?{
this.queue?=?queue;
}
@Override
public?void?run()?{
try?{
do?{
Object?number?=?queue.remove();
System.out.println("[Consumer]:?"?+?number);
if(number?==?null){
return;
}
}?while(!queue.isEmpty());
}
catch?(InterruptedException?ex)?{
ex.printStackTrace();
}
}
}
}
這將產(chǎn)生以下結(jié)果。[Producer]:?1
[Consumer]:?1
[Producer]:?2
[Consumer]:?2
[Producer]:?3
[Consumer]:?3
[Producer]:?4
[Consumer]:?4
[Producer]:?5
[Producer]:?6
[Consumer]:?5
[Producer]:?7
[Consumer]:?6
[Consumer]:?7
[Producer]:?8
[Consumer]:?8
[Producer]:?9
[Consumer]:?9
[Producer]:?10
[Consumer]:?10
[Producer]:?11
[Consumer]:?11
[Producer]:?12
[Consumer]:?12
[Consumer]:?null
分享到:
0評(píng)論
總結(jié)
以上是生活随笔為你收集整理的newcondition java_Java并发Condition接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将Chrome浏览器默认保存离线网页为“
- 下一篇: 坦克大战游戏java代码_Java实现坦