使用执行器服务

Use of Executor Service

执行器服务运行中的线程是否并行并且在向它们提交任务时不分时?如果他们不 运行 并行那么执行程序服务有什么用?

ExecutorService 只是对执行异步操作的抽象。它负责管理传入的任务并将它们分布在可用的线程上。

至于线程本身,取决于环境,i。 e.机器,os 和 jvm。如果你有一个单核处理器,或者 os 不支持它,你就不会并行处理事情。然而,在现代机器上,您肯定会在某种程度上体验到并行执行。请记住,即使您手动创建线程,也不能保证它们会被操作系统并行执行。

Executor 服务是一个复杂的线程池,允许在后台执行多个独立任务。

它们是否并行处理,取决于您的机器中有多少 cpu 个可用单元,而这些 cpu 的确切用途不受程序员控制。

来自 Java 文档:

An Executor that provides methods to manage termination and methods that can produce a Future for tracking progress of one or more asynchronous tasks.

通常,ALL 提交给 ExecutorService 的可调用文件将始终 运行 与主线程并行。至于在ExecutorService中提交的任务,它们可以是并行的,这取决于在服务中为运行指定了多少个线程。

如果您使用的执行器服务只有 1 个 Thread,那么无论您提交多少任务,在任何给定时间 上都只有一个 运行该执行者服务.

如果您有一个使用 5 个 Threads 的执行程序服务,那么最多 5 个提交的任务将 运行 彼此并行。

这是一个示例代码:

public class ExecutorServiceTest {
public static ExecutorService service = Executors.newFixedThreadPool(5);
public static void main(String[] args) throws Exception {
    System.out.println("Submitting!");

    service.submit(new PrintCallable("Callable 1"));
    service.submit(new PrintCallable("Callable 2"));
    service.submit(new PrintCallable("Callable 3"));
    service.submit(new PrintCallable("Callable 4"));
    service.submit(new PrintCallable("Callable 5"));

    service.shutdown();
    service.awaitTermination(10, TimeUnit.SECONDS);

    System.out.println("Done!");
}

private static class PrintCallable implements Callable<Void> {

    private final String toPrint;

    private PrintCallable(String toPrint) {
        this.toPrint = toPrint;
    }

    @Override
    public Void call() throws Exception {
        for(int i=0; i<5; i++) {
            Thread.sleep(100);
            System.out.println(toPrint);
        }
        return null;
    }

}

}

运行 该代码将以交织方式打印 "Callable x"。

注意:我确定之前有人问过这个问题,但我找不到与此问题非常相似的任何内容。