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");
}