Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 换气机堵塞了吗?_Java_Multithreading - Fatal编程技术网

Java 换气机堵塞了吗?

Java 换气机堵塞了吗?,java,multithreading,Java,Multithreading,exchanger.exchange()是否会导致线程移动到阻塞状态。在java文档中,提到到达交换机的第一个线程将“等待”第二个线程。您的答案在您提到的java文档中。显然,该方法将阻塞第一个线程,直到第二个线程调用该方法。您的答案在您提到的Javadoc中。显然,该方法将阻塞第一个线程,直到第二个线程调用该方法。交换器不阻塞线程,它会导致到达交换器的第一个线程等待。交换器不阻塞线程,它导致到达交换机的第一个线程等待。调用exchange的第一个线程将其状态更改为 查看发生了什么的简单代码片段

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

您的答案在您提到的java文档中。显然,该方法将阻塞第一个线程,直到第二个线程调用该方法。

您的答案在您提到的Javadoc中。显然,该方法将阻塞第一个线程,直到第二个线程调用该方法。

交换器不阻塞线程,它会导致到达交换器的第一个线程等待。

交换器不阻塞线程,它导致到达交换机的第一个线程等待。

调用exchange的第一个线程将其状态更改为

查看发生了什么的简单代码片段:

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());
    }
}
公共类交换测试{
公共静态void main(字符串[]args)引发InterruptedException{
最终换热器ex=新换热器();
线程t1=新线程(新的可运行线程(){
@凌驾
公开募捐{
System.out.println(“线程1”);
试一试{
外汇(10升);
}捕捉(中断异常e){
Thread.currentThread().interrupt();
}
}
});
t1.start();
Thread.sleep(500);//给t1时间开始
System.out.println(t1.getState());
}
}

调用exchange的第一个线程将其状态更改为

查看发生了什么的简单代码片段:

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());
    }
}
公共类交换测试{
公共静态void main(字符串[]args)引发InterruptedException{
最终换热器ex=新换热器();
线程t1=新线程(新的可运行线程(){
@凌驾
公开募捐{
System.out.println(“线程1”);
试一试{
外汇(10升);
}捕捉(中断异常e){
Thread.currentThread().interrupt();
}
}
});
t1.start();
Thread.sleep(500);//给t1时间开始
System.out.println(t1.getState());
}
}

需要说明的是,有六种线程状态:新建、可运行、阻塞、等待、定时等待和终止

在您的场景中,第一个线程将从可运行变为等待,并一直等待,直到第二个线程到达


当线程在等待获取互斥时被阻塞时,将使用阻塞状态。在这种特殊情况下,第一个线程是首先获取互斥体的线程,因此此时它不会进入阻塞状态。但是,第二个线程到达时可能会暂时进入阻塞状态,或者第一个线程在收到通知后可能会暂时进入阻塞状态。

要清楚,有六种线程状态:新建、可运行、阻塞、等待、定时等待和终止

在您的场景中,第一个线程将从可运行变为等待,并一直等待,直到第二个线程到达

当线程在等待获取互斥时被阻塞时,将使用阻塞状态。在这种特殊情况下,第一个线程是首先获取互斥体的线程,因此此时它不会进入阻塞状态。但是,第二个线程到达时可能会暂时进入阻塞状态,或者第一个线程在收到通知后可能会暂时进入阻塞状态