Ensuring task execution order in threadpool

后端 未结 17 965
情深已故
情深已故 2020-12-12 11:54

I have been reading about the thread-pool pattern and I can\'t seem to find the usual solution for the following problem.

I sometimes want tasks to be executed serial

17条回答
  •  情歌与酒
    2020-12-12 12:41

    This is achievable, well, as far as I understand your scenario. Basically what you need is do something smart to coordinate your tasks in main thread. Java API your need are ExecutorCompletionService and Callable

    First, implement your callable task:

    public interface MyAsyncTask extends Callable {
      // tells if I am a normal or dependent task
      private boolean isDependent;
    
      public MyAsyncTask call() {
        // do your job here.
        return this;
      }
    }
    

    Then in your main thread, use CompletionService coordinate the dependent task execution (i.e. a wait mechanism):

    ExecutorCompletionService completionExecutor = new 
      ExecutorCompletionService(Executors.newFixedThreadPool(5));
    Future dependentFutureTask = null;
    for (MyAsyncTask task : tasks) {
      if (task.isNormal()) {
        // if it is a normal task, submit it immediately.
        completionExecutor.submit(task);
      } else {
        if (dependentFutureTask == null) {
          // submit the first dependent task, get a reference 
          // of this dependent task for later use.
          dependentFutureTask = completionExecutor.submit(task);
        } else {
          // wait for last one completed, before submit a new one.
          dependentFutureTask.get();
          dependentFutureTask = completionExecutor.submit(task);
        }
      }
    }
    

    By doing this, you use a single executor (threadpool size 5) execute both normal and dependent tasks, the normal task are executed immediately as soon as submitted, the dependent tasks are executed one by one (wait are performed in main thread by calling get() on Future before submitting new dependent task), so at any point of time, you always have a number of normal tasks and a single dependent task (if exists) running in a single threadpool.

    This is just a head start, by using ExecutorCompletionService, FutureTask and Semaphore, you can implement more complex thread coordination scenario.

提交回复
热议问题