Java执行器未按顺序执行

Java执行器未按顺序执行,java,multithreading,executorservice,executor,Java,Multithreading,Executorservice,Executor,如果这是一个基本问题,我会提前道歉,但我对材料不熟悉。我有一个软件,是由用户通过网站提交作业启动的。因为软件本身就是为了利用并行处理而设计的,所以我想做的就是把这些作业排成队列,这样它们就可以一个接一个地启动。为此,我尝试利用Java内置的Executor框架。我开发的代码是: public JobManager() { mcpExecutor = Executors.newSingleThreadExecutor(); } public Future<MatlabProcess

如果这是一个基本问题,我会提前道歉,但我对材料不熟悉。我有一个软件,是由用户通过网站提交作业启动的。因为软件本身就是为了利用并行处理而设计的,所以我想做的就是把这些作业排成队列,这样它们就可以一个接一个地启动。为此,我尝试利用Java内置的Executor框架。我开发的代码是:

public JobManager()
{
    mcpExecutor = Executors.newSingleThreadExecutor();
}

public Future<MatlabProcessResults> startProcess(inputs)
{
    MyProcess myProcess = new MyProcess(inputs);
    Future<MyProcessResults> future = mcpExecutor.submit(myProcess);

    Long newKey = System.currentTimeMillis();
    futures.putIfAbsent(newKey, future);
}
其中每次按下submit按钮时都会运行startProcess。现在,newSingleThreadExecutor的描述如下:

创建一个执行器,该执行器使用在无界队列上运行的单个工作线程。但是,请注意,如果此单个线程在关机之前的执行过程中由于故障而终止,那么如果需要执行后续任务,将使用一个新线程来代替它。任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。与其他等效的newFixedThreadPool1不同,返回的执行器保证不可重新配置以使用其他线程


这让我想到它需要多个任务,对它们进行排队,并且一次只运行一个软件实例。你可能会怀疑,我写这篇文章是因为它没有这样做。据我所知,它开始了我并行提交的许多任务,这与大多数人可能想做的相反。非常感谢您在此问题上提供的任何帮助。

您是否将作业传递给同一个executor实例?newSingleThreadExecutor不并行启动线程,您的测试方法有缺陷。就这么简单。您可以使用System.out和volatile int验证顺序-此volatile int的每个输出都将被排序,值将依次增加。因此,只要您的ExecutorService是静态的,您就不可能描述问题。我的猜测是:您不断实例化JobManager,因此在每个线程中创建新的ExecutorServices。。。。这是初学者的错误。@pnaermao展示MyProcess类的相关部分;另外,您确定请求会转到同一个JobRequest实例吗?它不是一个单独的个体,你的执行者也不是静态的