ExecutorService以串行顺序执行可运行

时间:2018-12-10 06:00:56

标签: java multithreading threadpool threadpoolexecutor

我将executor服务与newSingleThreadExecutor一起使用以串行顺序执行我的Runnable任务,但是似乎不能保证串行执行顺序,因为有时任务是以随机顺序执行的。

executorService =  Executors.newSingleThreadExecutor();
executorService.submit(MyTask1);
executorService.submit(MyTask2);

MyTask执行一些异步操作,并将结果从执行任务的地方发送回类。

尽管文档说,必须串行执行newSingleThreadExecutor()任务,但我无法找出我在这里缺少的内容。任何帮助将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:3)

由于确保执行顺序是连续的,因此您可能不会在实际上正在运行的代码中使用单线程执行器。

要解决此问题,请提交执行两个任务的一个任务:

executorService.submit(() -> {MyTask1.run(); MyTask2.run();});

答案 1 :(得分:3)

tl; dr

如果您正在观看的结果是乱序产生的,那么一切都很好。异步工作是在其自己的单独时间表上进行的。按照定义,任务1发起的异步工作可能要等到任务1、2和3都完成很长时间之后才能完成。

异步意味着“不要等我”

您提到:

  

MyTask执行一些异步操作

异步执行意味着调用代码无需等待异步操作完成。

调用代码,即您的任务已提交给执行者服务,请求完成异步工作,该任务立即继续。如果该任务没有其他工作,则该任务已完成。因此执行程序服务可以继续进行。

执行程序服务继续运行。执行程序服务执行第二个提交的任务。同时,上面请求的异步工作可能尚未完成。异步工作可能正在等待资源,例如等待网络调用返回,或者异步工作正在等待数据库查询执行。通过definition of asynchronous,不会 not 阻止提交给执行者的任务。 executor服务现在正在运行第二个提交的任务,可能是第三个或第四个任务,最后,异步工作才能完成。

diagram of a series of submitted tasks being executed sequentially along a timeline with separate async work being done in parallel along several tasks after being spawned from the first task

功能,不是错误

换句话说,是功能而不是错误。由ExecutorService返回的Executors.newSingleThreadExecutor()履行了其“保证任务按顺序执行”的承诺。这些任务中的一项作为副产品分出了异步工作,这一事实并不能改变提交的任务确实按顺序执行的事实。