我正在使用带有 newSingleThreadExecutor 的执行器服务以串行顺序执行我的 Runnable 任务,但是似乎不能保证串行执行顺序,因为有时任务是以随机顺序执行的。executorService = Executors.newSingleThreadExecutor();executorService.submit(MyTask1);executorService.submit(MyTask2);MyTask 执行一些异步操作并将结果发送回我正在执行任务的类。尽管文档说,必须连续执行 newSingleThreadExecutor () 任务,但我无法找到我在这里缺少的内容。任何帮助将不胜感激。
2 回答
动漫人物
TA贡献1815条经验 获得超10个赞
如果您正在观看的结果是异步产生的,那么一切都很好。异步工作在其自己的单独时间线上完成。根据定义,任务 #1 启动的异步工作可能要等到任务 #1、2 和 3 全部完成(例如)之后很久才能完成。
异步意味着“不要等我”
你提到:
MyTask 执行一些异步操作
异步执行意味着调用代码不需要等待异步操作完成。
调用代码,即您提交给执行器服务的任务,请求完成异步工作,任务立即继续。如果该任务没有进一步的工作,则该任务已完成。所以执行器服务可以继续。
执行器服务继续进行。执行器服务执行第二个提交的任务。同时,上面请求的异步工作可能还没有完成。也许异步工作正在等待资源,例如等待网络上的调用返回,或者异步工作正在等待数据库查询执行。根据异步的定义,这不会阻止提交给执行程序的任务。执行器服务现在正在运行第二个提交的任务,可能是第三个或第四个,最后,您的异步工作完成。

功能,而不是错误
换句话说,一个特性,而不是一个错误。ExecutorService返回的 by履行Executors.newSingleThreadExecutor()了“任务保证按顺序执行”的承诺。作为副产品,其中一项任务衍生出异步工作这一事实并没有改变提交的任务确实按其顺序执行的事实。
LEATH
TA贡献1936条经验 获得超7个赞
由于保证执行顺序是连续的,因此您可能没有在实际运行的代码中使用单线程执行程序。
作为一种解决方法,请提交一个执行两件事的任务:
executorService.submit(() -> {MyTask1.run(); MyTask2.run();});添加回答
举报
0/150
提交
取消
