Java 使用right ExecutorService异步执行任务

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

在处理任务时,我必须处理两个子任务(基本上是步骤),它们可以异步完成

我创建了Executors.newSingleThreadExecutor(),并两次调用它execute。由于它是单线程池,这是否意味着第二个子任务(即下面代码中的步骤5)将串行执行,即仅在步骤3完成后执行。我是否需要实例化Executors.newFixedThreadExecutor(2)-以2作为参数,因为我只需要异步执行两个步骤,或者应该执行其他操作

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。