|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.util.concurrent
类 Exchanger<V>
java.lang.Object java.util.concurrent.Exchanger<V>
- 类型参数:
-
V
- 可以交换的对象类型
-
public class Exchanger<V>
- extends Object
两个线程可以交换对象的同步点。每个线程都在进入 exchange
方法时给出某个对象,并接受其他线程返回时给出的对象。
用法示例:以下是重点介绍的一个类,该类使用 Exchanger 在线程间交换缓冲区,因此,在需要时,填充缓冲区的线程获得一个新腾空的缓冲区,并将填满的缓冲区传递给腾空缓冲区的线程。
class FillAndEmpty { Exchanger<DataBuffer> exchanger = new Exchanger(); DataBuffer initialEmptyBuffer = ... a made-up type DataBuffer initialFullBuffer = ... class FillingLoop implements Runnable { public void run() { DataBuffer currentBuffer = initialEmptyBuffer; try { while (currentBuffer != null) { addToBuffer(currentBuffer); if (currentBuffer.full()) currentBuffer = exchanger.exchange(currentBuffer); } } catch (InterruptedException ex) { ... handle ... } } } class EmptyingLoop implements Runnable { public void run() { DataBuffer currentBuffer = initialFullBuffer; try { while (currentBuffer != null) { takeFromBuffer(currentBuffer); if (currentBuffer.empty()) currentBuffer = exchanger.exchange(currentBuffer); } } catch (InterruptedException ex) { ... handle ...} } } void start() { new Thread(new FillingLoop()).start(); new Thread(new EmptyingLoop()).start(); } }
- 从以下版本开始:
- 1.5
构造方法摘要 | |
---|---|
Exchanger() 创建一个新的 Exchanger。 |
方法摘要 | |
---|---|
V |
exchange(V x) 等待另一个线程到达此交换点(除非它被 中断 ),然后将给定的对象传送给该线程,并接收该线程的对象。 |
V |
exchange(V x, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(除非它被 中断 ,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造方法详细信息 |
---|
Exchanger
public Exchanger()
- 创建一个新的 Exchanger。
方法详细信息 |
---|
exchange
public V exchange(V x) throws InterruptedException
-
等待另一个线程到达此交换点(除非它被
中断
),然后将给定的对象传送给该线程,并接收该线程的对象。如果另一个线程已经在交换点等待,则出于线程调度目的,继续执行此线程,并接收当前线程传入的对象。当前线程立即返回,接收其他线程传递的交换对象。
如果还没有其他线程在交换点等待,则出于调度目的,禁用当前线程,且在发生以下两种情况之一前,该线程将一直处于休眠状态:
- 其他某个线程进入交换点;或者
- 其他某个线程
中断
当前线程。
如果当前线程:
- 在进入此方法时已经设置了该线程的中断状态;或者
- 在等待交换时被
中断
,
InterruptedException
,并且清除当前线程的已中断状态。 -
- 参数:
-
x
- 要交换的对象 - 返回:
- 另一个线程提供的对象。
- 抛出:
-
InterruptedException
- 如果当前线程在等待时被中断
exchange
public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
-
等待另一个线程到达此交换点(除非它被
中断
,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。如果另一个线程已经在交换点上等待,则出于线程调度目的,继续执行此线程,并接收当前线程传入的对象。当前线程立即返回,并接收其他线程传递的交换对象。
如果还没有其他线程在交换点等待,则出于调度目的,禁用当前线程,且在发生以下三种情况之一前,该线程将一直处于休眠状态:
- 其他某个线程进入交换点;或者
- 其他某个线程
中断
当前线程;或者 - 已超出指定的等待时间。
如果当前线程:
- 在进入此方法时已经设置其中断状态;或者
- 在等待交换时被
中断
,
InterruptedException
,并且清除当前线程的已中断状态。如果超出指定的等待时间,则抛出
TimeoutException
异常。如果该时间小于或等于零,则此方法根本不会等待。 -
- 参数:
-
x
- 要交换的对象 -
timeout
- 要等待的最长时间 -
unit
- timeout 参数的时间单位。 - 返回:
- 其他线程提供的对象。
- 抛出:
-
InterruptedException
- 如果当前线程在等待时被中断 -
TimeoutException
- 如果在另一个线程进入交换点之前已经到达指定的等待时间。
所有类
|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |