Java 使用right ExecutorService异步执行任务
在处理任务时,我必须处理两个子任务(基本上是步骤),它们可以异步完成 我创建了Executors.newSingleThreadExecutor(),并两次调用它execute。由于它是单线程池,这是否意味着第二个子任务(即下面代码中的步骤5)将串行执行,即仅在步骤3完成后执行。我是否需要实例化Executors.newFixedThreadExecutor(2)-以2作为参数,因为我只需要异步执行两个步骤,或者应该执行其他操作Java 使用right ExecutorService异步执行任务,java,asynchronous,concurrency,threadpool,executorservice,Java,Asynchronous,Concurrency,Threadpool,Executorservice,在处理任务时,我必须处理两个子任务(基本上是步骤),它们可以异步完成 我创建了Executors.newSingleThreadExecutor(),并两次调用它execute。由于它是单线程池,这是否意味着第二个子任务(即下面代码中的步骤5)将串行执行,即仅在步骤3完成后执行。我是否需要实例化Executors.newFixedThreadExecutor(2)-以2作为参数,因为我只需要异步执行两个步骤,或者应该执行其他操作 public class MyTaskImpl { private
public class MyTaskImpl
{
private static final ExecutorService JOB_EXEC_SVC = Executors.newSingleThreadExecutor();
public void doTask() throws Exception
{
// step 1
// step 2
// step 3 execute ASYNC
JOB_EXEC_SVC.execute(() -> step3(param1, param2));
// step 4
// step 5 execute ASYNC
JOB_EXEC_SVC.execute(() -> step5(param));
// step 6
}
}
你说得对。由于您使用的
ExecutorService
是使用newSingleThreadExecutor
创建的,因此步骤5将在步骤3完成后完成。要异步执行这两个操作,请使用newFixedThreadExecutor
:
public class MyTaskImpl {
private static final ExecutorService JOB_EXEC_SVC = Executors.newFixedThreadExecutor(2);
public void doTask() throws Exception {
// Step 1
// Step 2
// Step 3 (below)
JOB_EXEC_SVC.execute(() -> step3(param1, param2));
// Step 4
// Step 5 (below)
JOB_EXEC_SVC.execute(() -> step5(param));
}
}
然而,这并不保证步骤3和步骤5将并行执行。例如,如果步骤4需要很长时间才能完成,则步骤5可以在步骤3已经完成执行之后提交给ExecutorService
(即调用execute
)
对于单线程情况也是如此,但无论步骤4花费多少时间,步骤5都将在步骤3完成后执行(但不确定是否在步骤3运行时提交步骤5并阻止直到步骤3完成,或者是否在步骤3完成后提交步骤5)。您是对的。因为您使用的是单个线程,所以线程在两个任务中共享。这意味着这两个任务将异步执行,但它们将串行执行,即步骤5将在步骤3之后执行。如果您想同时执行步骤3和步骤5,那么Executors.newFixedThreadExecutor(2)对此很有用。您可以使用Executors.newCachedThreadPool()来提高性能。另一个选项是使用,它使用公共ForkJoinPool。