Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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

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_Executorservice - Fatal编程技术网

在java方法中执行并行任务

在java方法中执行并行任务,java,multithreading,executorservice,Java,Multithreading,Executorservice,我对java中的并行编程相当陌生。我写了两个方法,每个方法对一组数据并行操作。方法A必须在方法B开始之前完成。我想知道执行并行任务的方法何时终止。是: 所有任务何时完成执行?或 所有任务提交执行后 NB:我已经用java visualVM监控了线程,我意识到线程大部分时间都在状态监视器中等待。您已经用executorservice标记了它,所以我假设您使用的是javaexecutorservice。答案取决于你的方法到底做了什么 如果您的方法仅对各自的并行任务调用ExecutorServic

我对java中的并行编程相当陌生。我写了两个方法,每个方法对一组数据并行操作。方法A必须在方法B开始之前完成。我想知道执行并行任务的方法何时终止。是:

  • 所有任务何时完成执行?或
  • 所有任务提交执行后

NB:我已经用java visualVM监控了线程,我意识到线程大部分时间都在状态监视器中等待。

您已经用
executorservice
标记了它,所以我假设您使用的是java
executorservice
。答案取决于你的方法到底做了什么

如果您的方法仅对各自的并行任务调用
ExecutorService.submit()
ExecutorService.execute()
,则在提交所有任务后立即退出;当方法退出时,并行任务可能仍在执行


如果要等待与某个方法关联的所有任务完成,请首先为每个任务调用
ExecutorService.submit()
,存储返回的
Futures
。然后,在提交所有任务后,在每个
未来
上调用
Future.get()
Future.get()
在相关任务完成之前不会返回,因此一旦对
Future.get()
的所有调用都返回,所有任务都已完成,您可以退出该方法并继续下一个方法。

如果方法A必须在方法B启动之前完成,那么它们就不是并行运行的,也没有必要让这些方法在单独的线程中运行…@Jesper方法A对一组数据并行执行一个操作(比方说C),方法B对该组数据执行相同的操作。但是B应该只在A完成时启动,因为它对A的结果数据并行应用了他的操作(比如D)。确保B()只在A()完成后启动的最佳方法是让一个线程先调用A(),然后再调用B()。当你说“两个方法都对一组数据并行操作”时是什么意思您已经明确表示不希望两个方法调用重叠,因此如果它们没有并行调用,那么“并行”会发生什么?我的意思是A()并行处理数据集,B()也会这样做,第二部分描述了我目前正在做的事情。谢谢你的澄清。