Exhanger.exchange会阻止吗?

时间:2010-12-11 23:53:57

标签: java multithreading

exchange.exchange()会导致线程移动到阻塞状态。在java文档中,提到到达交换器的第一个线程将“等待”第二个线程。

4 个答案:

答案 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。显然,该方法将阻塞第一个线程,直到第二个线程调用该方法。