Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ExecutorService以串行顺序执行runnable_Java_Multithreading_Threadpool_Threadpoolexecutor - Fatal编程技术网

Java ExecutorService以串行顺序执行runnable

Java ExecutorService以串行顺序执行runnable,java,multithreading,threadpool,threadpoolexecutor,Java,Multithreading,Threadpool,Threadpoolexecutor,我正在将executor服务与newSingleThreadExecutor一起使用,以串行顺序执行我的可运行任务,但是似乎串行执行顺序没有保证,因为有时任务是以随机顺序执行的 executorService = Executors.newSingleThreadExecutor(); executorService.submit(MyTask1); executorService.submit(MyTask2); MyTask执行一些异步操作,并将结果发送回我执行任务的类 虽然docs说,

我正在将executor服务与newSingleThreadExecutor一起使用,以串行顺序执行我的可运行任务,但是似乎串行执行顺序没有保证,因为有时任务是以随机顺序执行的

executorService =  Executors.newSingleThreadExecutor();
executorService.submit(MyTask1);
executorService.submit(MyTask2);
MyTask执行一些异步操作,并将结果发送回我执行任务的类

虽然docs说,newSingleThreadExecutor()任务必须连续执行,但我无法找出我在这里遗漏了什么。如有任何帮助,将不胜感激


谢谢

因为执行顺序保证是顺序的,所以您可能没有在实际运行的代码中使用单线程执行器

作为一种解决方法,提交一项任务,该任务可完成两件事:


由于执行顺序保证是顺序的,所以在实际运行的代码中可能没有使用单线程执行器

作为一种解决方法,提交一项任务,该任务可完成两件事:

tl;博士 如果您看到的结果是异步生成的,那么一切正常。异步工作是在其单独的时间线上完成的。根据定义,任务1启动的异步工作可能要在任务1、2和3全部完成后很久才能完成(例如)

异步意味着“不要等我” 你提到:

MyTask执行一些异步操作

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

调用代码,即提交给executor服务的任务,请求完成异步工作,任务立即继续。如果该任务没有进一步的工作,则该任务已完成。所以executor服务可以继续

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

功能,而不是bug 换句话说,这是一个特性,而不是一个bug。返回的任务实现了“保证按顺序执行任务”的承诺。作为一个副产品,其中一个任务派生出异步工作,这一事实并没有改变提交的任务确实是按顺序执行的事实。

tl;博士 如果您看到的结果是异步生成的,那么一切正常。异步工作是在其单独的时间线上完成的。根据定义,任务1启动的异步工作可能要在任务1、2和3全部完成后很久才能完成(例如)

异步意味着“不要等我” 你提到:

MyTask执行一些异步操作

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

调用代码,即提交给executor服务的任务,请求完成异步工作,任务立即继续。如果该任务没有进一步的工作,则该任务已完成。所以executor服务可以继续

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

功能,而不是bug
换句话说,这是一个特性,而不是一个bug。返回的任务实现了“保证按顺序执行任务”的承诺。作为副产品,这些任务中的一项派生出异步工作,这一事实并不改变提交的任务确实是按顺序执行的。

在异步执行任务时,执行顺序很可能丢失。当您已经在使用executor服务时,
MyTask
为什么必须异步运行?@ernest_k MyTask1将连接到服务器并在回调时从服务器获取一些信息,根据这些信息我必须启动MyTask2。根据您的评论,您应该使用task1的一些输出运行task2。在这种情况下,返回Future并添加一个条件是可以的,检查task1在提交task2之前返回了您需要的内容?如何调用回调?可能是MyTask1完成了,然后是MyTask2,最后是回调吗?哪个线程正在执行回调?您的问题似乎无法按上述方式重新创建。请提供一个说明。在异步执行任务时,可能会丢失执行顺序。当您已经在使用executor服务时,
MyTask
为什么必须异步运行?@ernest_k MyTask1将连接到服务器并在回调时从服务器获取一些信息,根据这些信息我必须启动MyTask2。根据您的评论,您应该使用task1的一些输出运行task2。在这种情况下,返回Future并添加一个条件是可以的,检查task1在提交task2之前返回了您需要的内容?如何调用回调?可能是MyTask1完成了,然后是MyTask2,最后是回调吗?哪个线程正在执行回调?您的问题似乎无法按上述方式重新创建。请提供一份详细说明。???引用一下:
任务保证按顺序执行
这如何解决异步工作(缓慢地)在一旁完成的问题?@Bohemian。。这是如何执行服务。提交(()->{
executorService.submit(() -> {MyTask1.run(); MyTask2.run();});