Java 当我在CyclicBarrier回调中调用join时,应用程序挂起

Java 当我在CyclicBarrier回调中调用join时,应用程序挂起,java,multithreading,concurrency,cyclicbarrier,Java,Multithreading,Concurrency,Cyclicbarrier,我有以下方法测试,从这里开始线程: public static void main(String[] args) throws InterruptedException { List<Thread> threads = new ArrayList<>(); final CyclicBarrier cyclicBarrier = new CyclicBarrier(1); Thread thread = new Thread(

我有以下方法测试,从这里开始线程:

public static void main(String[] args) throws InterruptedException {
        List<Thread> threads = new ArrayList<>();
        final CyclicBarrier cyclicBarrier = new CyclicBarrier(1);
        Thread thread = new Thread(new CallbackThread(cyclicBarrier, threads));
        threads.add(thread);
        thread.start();          
    }
应用程序挂起

我不明白为什么

如果要替换连接逻辑到主方法-所有商品都好

public static void main(String[] args) throws InterruptedException {
        List<Thread> threads = new ArrayList<>();
        final CyclicBarrier cyclicBarrier = new CyclicBarrier(1);
        Thread thread = new Thread(new CallbackThread(cyclicBarrier, threads));
        threads.add(thread);
        thread.start();
        for (Thread thread1 : threads) {
            try {
                thread1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
        System.out.println("Threads finished");

    }
publicstaticvoidmain(String[]args)抛出InterruptedException{
List threads=new ArrayList();
最终车手车手车手=新车手(1);
线程线程=新线程(新回调线程(cyclicBarrier,threads));
线程。添加(线程);
thread.start();
用于(螺纹1:螺纹){
试一试{
thread1.join();
}捕捉(中断异常e){
e、 printStackTrace();//要更改catch语句的主体,请使用文件|设置|文件模板。
}
}
System.out.println(“螺纹加工”);
}
你能解释一下这种区别吗。

第一个示例中的代码在自己的线程上调用join。将其添加到列表中,线程在列表中迭代并联接列表中的每个线程。

第一个示例中的代码在其自己的线程上调用联接。将其添加到列表中,线程在列表中迭代并联接列表中的每个线程。

第一个示例中的代码在其自己的线程上调用联接。将其添加到列表中,线程在列表中迭代并联接列表中的每个线程。

第一个示例中的代码在其自己的线程上调用联接。您将其添加到列表中,线程在列表上迭代,并加入列表中的每个线程。

您正在自行加入。这就是为什么这个节目永远不会结束

当您从主线程调用
join()
时,主线程正试图连接它创建的线程,即
CallableThread
。因此,这是恰当的

但是当您加入
CallableThread
时,您将传递
threads[]
,其中包含对自身的引用。因此,它正在加入它自己,这不会结束。

你是在自我加入。这就是为什么这个节目永远不会结束

当您从主线程调用
join()
时,主线程正试图连接它创建的线程,即
CallableThread
。因此,这是恰当的

但是当您加入
CallableThread
时,您将传递
threads[]
,其中包含对自身的引用。因此,它正在加入它自己,这不会结束。

你是在自我加入。这就是为什么这个节目永远不会结束

当您从主线程调用
join()
时,主线程正试图连接它创建的线程,即
CallableThread
。因此,这是恰当的

但是当您加入
CallableThread
时,您将传递
threads[]
,其中包含对自身的引用。因此,它正在加入它自己,这不会结束。

你是在自我加入。这就是为什么这个节目永远不会结束

当您从主线程调用
join()
时,主线程正试图连接它创建的线程,即
CallableThread
。因此,这是恰当的


但是当您加入
CallableThread
时,您将传递
threads[]
,其中包含对自身的引用。因此,它正在加入自身,这不会结束。

请看这个请看这个请看这个请看这个:请看这个:请看这个:请看这个:您不应该添加新问题,而是编辑这个问题以给出正确的示例。我已投票决定结束您的新问题,并将其标记为版主关注。@Narendra Pathai实际上我应该删除此问题,但我不能,因为它已经删除了answers@Narendra巴泰仔细阅读。不重复。您不应添加新问题,但应编辑此问题以给出正确的示例。我已投票决定结束您的新问题,并将其标记为版主关注。@Narendra Pathai实际上我应该删除此问题,但我不能,因为它已经删除了answers@Narendra巴泰仔细阅读。不重复。您不应添加新问题,但应编辑此问题以给出正确的示例。我已投票决定结束您的新问题,并将其标记为版主关注。@Narendra Pathai实际上我应该删除此问题,但我不能,因为它已经删除了answers@Narendra巴泰仔细阅读。不重复。您不应添加新问题,但应编辑此问题以给出正确的示例。我已投票决定结束您的新问题,并将其标记为版主关注。@Narendra Pathai实际上我应该删除此问题,但我不能,因为它已经删除了answers@Narendra巴泰仔细阅读。它不是复制品
Threads started
public static void main(String[] args) throws InterruptedException {
        List<Thread> threads = new ArrayList<>();
        final CyclicBarrier cyclicBarrier = new CyclicBarrier(1);
        Thread thread = new Thread(new CallbackThread(cyclicBarrier, threads));
        threads.add(thread);
        thread.start();
        for (Thread thread1 : threads) {
            try {
                thread1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
        System.out.println("Threads finished");

    }