Java 中断和连接线程中的ForEach循环

Java 中断和连接线程中的ForEach循环,java,multithreading,foreach,Java,Multithreading,Foreach,有一个ArrayListwheels,Wheel是一个扩展线程的类,如果我有以下情况会发生什么: wheels.forEach(a -> { try{ a.interrupt(); a.join(); }catch(InterruptedException exception){} }); 此代码的指令顺序是什么 现在我认

有一个
ArrayList
wheels,Wheel是一个扩展线程的类,如果我有以下情况会发生什么:

wheels.forEach(a -> {
                try{
                    a.interrupt();
                    a.join();
                }catch(InterruptedException exception){}
            });
此代码的指令顺序是什么

现在我认为它将发生以下情况:1)a被中断,2)我的主线程将加入a,并且只有在a完成后,forEach循环才会继续进行项目的重新制作,对吗

是否可以在ArrayList中执行迭代,其中所有线程都将被中断和连接,而不需要手动逐项执行


非常感谢你的帮助

约翰尼的评论对于您当前的实现是正确的。你也可以走另一条路,比如

您可以在Wheel类中实现Runnable(或Callable),并将任务列表提交给executor服务,而不是扩展线程。通过这种方式,您可以获得线程池(重用线程)的好处,并使用内置的关闭和等待所有线程完成的功能

例如:

ExecutorService executor = Executors.newFixedThreadPool(5);
wheels.foreach(wheel -> executor.submit(wheel));

//when you want to shutdown
executor.shutdownNow(); // this will send interrupt to thread pool threads.
executor.awaitTermination(10, TimeUnit.SECONDS); 
// block the current thread until executor finishes or timeout expires. 
// You could give a bigger timeout or call this with in a while loop to ensure 
// executor definitely finished.
// like this: while(!executor.awaitTermination(10, TimeUnit.SECONDS));

Johnny的评论对于您当前的实现是正确的。你也可以走另一条路,比如

您可以在Wheel类中实现Runnable(或Callable),并将任务列表提交给executor服务,而不是扩展线程。通过这种方式,您可以获得线程池(重用线程)的好处,并使用内置的关闭和等待所有线程完成的功能

例如:

ExecutorService executor = Executors.newFixedThreadPool(5);
wheels.foreach(wheel -> executor.submit(wheel));

//when you want to shutdown
executor.shutdownNow(); // this will send interrupt to thread pool threads.
executor.awaitTermination(10, TimeUnit.SECONDS); 
// block the current thread until executor finishes or timeout expires. 
// You could give a bigger timeout or call this with in a while loop to ensure 
// executor definitely finished.
// like this: while(!executor.awaitTermination(10, TimeUnit.SECONDS));

你可以把它分成两个循环。中断线程的程序。然后第二个加入每个人。@Johnnymop。苏特,但它不会有同样的问题吗?第二个将执行主等待,然后等待,然后再次等待。也许我看错了,我想要的是所有线程在“同一时间”(不完全是直观的,但大致上)连接,并且让main只等待一次。是的,但是对于2个循环,您首先在第一个循环中同时告诉所有线程“退出时间”(实际上)。因此,每个线程同时开始关闭。然后,在第二个循环中,您
join
a,假设这需要4秒钟。然后您
join
b但是b只花了2秒钟就关闭了,所以当您尝试
join
它时,b已经完成,并且
join
立即返回。所以整个过程需要4秒(任何线程需要关闭的最长时间),而不是6秒(所有线程的累计时间)。我想这是你的目标。@Johnnymapp是的!就这样!谢谢你这么详细的回答:)@johnymop尽管这不是一个答案,只是一个评论。如果你把它放在一个答案里,人们就可以投票,接受它,等等。提示,提示。你可以把它分成两个循环。中断线程的程序。然后第二个加入每个人。@Johnnymop。苏特,但它不会有同样的问题吗?第二个将执行主等待,然后等待,然后再次等待。也许我看错了,我想要的是所有线程在“同一时间”(不完全是直观的,但大致上)连接,并且让main只等待一次。是的,但是对于2个循环,您首先在第一个循环中同时告诉所有线程“退出时间”(实际上)。因此,每个线程同时开始关闭。然后,在第二个循环中,您
join
a,假设这需要4秒钟。然后您
join
b但是b只花了2秒钟就关闭了,所以当您尝试
join
它时,b已经完成,并且
join
立即返回。所以整个过程需要4秒(任何线程需要关闭的最长时间),而不是6秒(所有线程的累计时间)。我想这是你的目标。@Johnnymapp是的!就这样!谢谢你这么详细的回答:)@johnymop尽管这不是一个答案,只是一个评论。如果你把它放在一个答案里,人们就可以投票,接受它,等等。暗示,暗示。