exchange.exchange()会导致线程移动到阻塞状态。在java文档中,提到到达交换器的第一个线程将“等待”第二个线程。
答案 0 :(得分:3)
Exchanger不会阻塞某个线程,它会导致第一个线程到达交换器等待。
答案 1 :(得分:2)
要清楚,有六种线程状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING和TERMINATED。
在你的场景中,第一个线程将从RUNNABLE转到WAITING,并保持WAITING直到第二个线程到达。
在等待获取互斥锁时线程被阻塞时使用BLOCKED状态。在这种特殊情况下,第一个线程是首先获取互斥锁的线程,因此它不会在该点进入BLOCKED状态。但是,第二个线程可能会在到达时暂时进入BLOCKED状态,或者第一个线程在接收到通知后暂时进入BLOCKED状态。
答案 2 :(得分:1)
第一个线程调用交换将其状态更改为WAITING
一个简单的代码段,看看会发生什么:
public class ExchangerTest {
public static void main(String[] args) throws InterruptedException {
final Exchanger<Long> ex = new Exchanger<Long>();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread 1");
try {
ex.exchange(10L);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
t1.start();
Thread.sleep(500); //give t1 time to start
System.out.println(t1.getState());
}
}
答案 3 :(得分:0)
你的回答是你自己提到的Javadoc。显然,该方法将阻塞第一个线程,直到第二个线程调用该方法。