Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中的任务?_Java_Multithreading_Concurrency - Fatal编程技术网

Java 如何按顺序执行ExecutorService中的任务?

Java 如何按顺序执行ExecutorService中的任务?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有三个连接的线程,即第二个线程在第一个线程死后执行 这是我的代码: public class Main { public static void main(String args[]) throws Exception { final Thread thrdA = new Thread(() -> System.out.println("Message 1")); final Thread thrdB = new Thread(() -> S

我有三个连接的线程,即第二个线程在第一个线程死后执行

这是我的代码:

public class Main {
    public static void main(String args[]) throws Exception {
        final Thread thrdA = new Thread(() -> System.out.println("Message 1"));
        final Thread thrdB = new Thread(() -> System.out.println("Message 2"));
        final Thread thrdC = new Thread(() -> System.out.println("Message 3"));

        thrdA.start();
        thrdA.join();
        thrdB.start();
        thrdB.join();
        thrdC.start();
        thrdC.join();

    }
}

我将如何使用
ExecutorService
而不是三个线程对象来实现此功能?

如果您想要/需要的是在一个不同于主应用程序线程的单个线程中逐个执行一组作业,那么请使用


您可以使用带有future.get()方法的SingleThread ExecutorService控制线程的顺序执行

DummyTask类

import java.util.concurrent.Callable;

public class DummyTask implements Callable<Integer>
{

int taskId;

public DummyTask(int taskId) {
    this.taskId = taskId;
}

@Override
public Integer call() throws Exception
{
    System.out.println("excuting task... Task Id: " + taskId);
    return taskId;
}

}
package com.amit.executorservice;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class SequentialExecution 
{
public static void main(String[] args) throws InterruptedException, ExecutionException {

    DummyTask task1 = new DummyTask(1);
    DummyTask task2 = new DummyTask(2);
    DummyTask task3 = new DummyTask(3);
    Future<Integer> result = null;
    ExecutorService executor = Executors.newSingleThreadExecutor();

    result = executor.submit( task1 );
    // future.get() Waits for the task to complete, and then retrieves its result.
    result.get();

    result = executor.submit( task2 );
    // future.get() Waits for the task to complete, and then retrieves its result.
    result.get();

    result = executor.submit( task3 );
    // future.get() Waits for the task to complete, and then retrieves its result.
    result.get();

    executor.shutdown();

}
}

输出将始终相同,所有任务都将按顺序执行。

如果您已经在应用程序中使用了线程池,则可以通过零线程代理串行执行器重用它,而无需创建特殊的单线程线程池。
一个实现在我的Github存储库中的另一个优化实现中进行了描述。

如果我这样做,则消息不会按照我启动线程的顺序执行,例如,输出应该是“消息1”然后是“消息2”然后是“消息3”。它们以随机顺序执行,例如“消息2”、“消息3”、“消息1”。我想说的是,如何为executorservice中的每条消息执行runnable,使输出按升序依次为“消息1”、“消息2”和“消息3”,而不是随机顺序,如“消息2”、“消息3”、“消息1”。@RaeesSharif Aamir我感到困惑。您的问题询问了多个线程,但似乎您一次只想做一件事。@David没错。OP只需要一个线程来执行几个任务,一个接一个。@RaeesSharif Aamir既然OP接受这个答案,我相信这个问题的标题是错的。(或者答案是,如果只有一个线程,那么很容易加入所有线程。)不要忘记在关机后等待任务完成:
es.waittermination(1,TimeUnit.HOURS)
。它与
连接
具有相同的实际目标。这里的关键是
执行器。newSingleThreadExecutor()
,而不是
未来
的用法。
package com.amit.executorservice;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class SequentialExecution 
{
public static void main(String[] args) throws InterruptedException, ExecutionException {

    DummyTask task1 = new DummyTask(1);
    DummyTask task2 = new DummyTask(2);
    DummyTask task3 = new DummyTask(3);
    Future<Integer> result = null;
    ExecutorService executor = Executors.newSingleThreadExecutor();

    result = executor.submit( task1 );
    // future.get() Waits for the task to complete, and then retrieves its result.
    result.get();

    result = executor.submit( task2 );
    // future.get() Waits for the task to complete, and then retrieves its result.
    result.get();

    result = executor.submit( task3 );
    // future.get() Waits for the task to complete, and then retrieves its result.
    result.get();

    executor.shutdown();

}
}
excuting task... Task Id: 1
excuting task... Task Id: 2
excuting task... Task Id: 3