我将executor服务与newSingleThreadExecutor一起使用以串行顺序执行我的Runnable任务,但是似乎不能保证串行执行顺序,因为有时任务是以随机顺序执行的。
executorService = Executors.newSingleThreadExecutor();
executorService.submit(MyTask1);
executorService.submit(MyTask2);
MyTask执行一些异步操作,并将结果从执行任务的地方发送回类。
尽管文档说,必须串行执行newSingleThreadExecutor()任务,但我无法找出我在这里缺少的内容。任何帮助将不胜感激。
谢谢
答案 0 :(得分:3)
由于确保执行顺序是连续的,因此您可能不会在实际上正在运行的代码中使用单线程执行器。
要解决此问题,请提交执行两个任务的一个任务:
executorService.submit(() -> {MyTask1.run(); MyTask2.run();});
答案 1 :(得分:3)
如果您正在观看的结果是乱序产生的,那么一切都很好。异步工作是在其自己的单独时间表上进行的。按照定义,任务1发起的异步工作可能要等到任务1、2和3都完成很长时间之后才能完成。
您提到:
MyTask执行一些异步操作
异步执行意味着调用代码无需等待异步操作完成。
调用代码,即您的任务已提交给执行者服务,请求完成异步工作,该任务立即继续。如果该任务没有其他工作,则该任务已完成。因此执行程序服务可以继续进行。
执行程序服务继续运行。执行程序服务执行第二个提交的任务。同时,上面请求的异步工作可能尚未完成。异步工作可能正在等待资源,例如等待网络调用返回,或者异步工作正在等待数据库查询执行。通过definition of asynchronous,不会 not 阻止提交给执行者的任务。 executor服务现在正在运行第二个提交的任务,可能是第三个或第四个任务,最后,异步工作才能完成。
换句话说,是功能而不是错误。由ExecutorService
返回的Executors.newSingleThreadExecutor()
履行了其“保证任务按顺序执行”的承诺。这些任务中的一项作为副产品分出了异步工作,这一事实并不能改变提交的任务确实按顺序执行的事实。