用于任务间同步的java多线程
我对java中的多线程环境有一个要求。问题是这样的 我假设有10个不同的任务,我想把这10个任务分配给10个不同的线程。现在,这些任务的完成时间可能会有所不同。当这10条螺纹全部完成时,需要执行一些精加工或清理任务。换句话说,我需要等待所有线程完成,然后只有我才能继续执行进一步的代码 如果这里需要更多的细节,请告诉我 坦斯克, 大小为10的Ashish(JDK java.util.concurrent)CyclicBarier(代码)非常适合您。使用CyclicBarier,您可以等待10个线程。如果所有t线程都实现了barier,那么您可以更进一步用于任务间同步的java多线程,java,multithreading,synchronized,Java,Multithreading,Synchronized,我对java中的多线程环境有一个要求。问题是这样的 我假设有10个不同的任务,我想把这10个任务分配给10个不同的线程。现在,这些任务的完成时间可能会有所不同。当这10条螺纹全部完成时,需要执行一些精加工或清理任务。换句话说,我需要等待所有线程完成,然后只有我才能继续执行进一步的代码 如果这里需要更多的细节,请告诉我 坦斯克, 大小为10的Ashish(JDK java.util.concurrent)CyclicBarier(代码)非常适合您。使用CyclicBarier,您可以等待10个线程
编辑:
CyclicBarier
几乎与CountDownLatch
相同,但您可以重用barier调用reset()方法。听起来是一个理想的工作
用10次计数初始化它,当每个线程完成其任务时,它倒计时一次。
当所有10个线程都完成时,CountDownLatch
将让原始线程运行,并且它可以执行清理
然后启动一个包含10个固定线程的线程来运行任务。如果每个线程在完成后终止,您可以使用该语句。可以在基本Java教程中找到
ArrayList<Thread> myThreads = new ArrayList<Thread>();
for (int i = 0; i < 10; i++){
//MyTaskRunnable is a Runnable with your logic
Thread t = new Thread(new MyTaskRunnable());
myThreads.add(t);
}
for(Thread t : myThreads){
t.start();
}
//here all threads are running
for(Thread t : myThreads){
t.join();
}
//here all threads have terminated
ArrayList myThreads=new ArrayList();
对于(int i=0;i<10;i++){
//MyTaskRunnable是一个带有逻辑的Runnable
线程t=新线程(new MyTaskRunnable());
增加(t);
}
对于(线程t:myThreads){
t、 start();
}
//这里所有的线程都在运行
对于(线程t:myThreads){
t、 join();
}
//这里所有线程都已终止
编辑:
其他答案都有各自的优点,在实践中非常有用,join()
是最基本的结构。CyclicBarrier
和CountDownLatch
版本允许线程在到达同步点后继续运行,这在某些情况下是必要的。ExecutorService
更适合于需要在固定数量的线程(也称为线程池)上执行的许多任务,仅为10个任务创建ExecutorService有点过分
最后,如果您是Java新手,或者正在学习并发性课程,您应该尝试所有的变体,看看它们能做什么。连接是这些构造中最基本的,它将帮助您了解正在发生的事情。它也是大多数其他语言支持的基本模型 当
CountDownLatch
和CyclicBarier
执行同步多个线程并在所有线程到达所需点时执行一个操作的工作时,它们要求所有任务积极使用此功能。如果您只对完成整个任务感兴趣,那么解决方案可以简单得多:将所有任务添加到集合
,并使用ExecutorService
的invokeAll
方法,该方法在所有任务完成后返回。一个简单的例子:
Callable<Void> simpleTask=new Callable<Void>() {
public Void call() {
System.out.println("Performing one job");
return null;
}
};
List<Callable<Void>> list = Collections.nCopies(10, simpleTask);
ExecutorService es=Executors.newFixedThreadPool(10);
es.invokeAll(list);
System.out.println("All completed");
Callable simpleTask=new Callable(){
公开作废通知(){
System.out.println(“执行一项作业”);
返回null;
}
};
List=Collections.nCopies(10,simpleTask);
Executors服务es=Executors.newFixedThreadPool(10);
es.invokeAll(列表);
系统输出打印项次(“全部完成”);
Check out@Izmaki您可以使用编辑前我评论的任何整数值构建CyclicBarier。忽略注释。优点是您可以提供一个单线程屏障操作,该操作在各方都在场时执行。