使用执行人服务

时间:2016-07-31 15:36:47

标签: java multithreading threadpool executorservice

执行程序服务中的线程是否并行运行,并且在向其提交任务时没有时间片?如果它们没有并行运行那么执行器服务的用途是什么?

3 个答案:

答案 0 :(得分:2)

ExecutorService只是执行异步操作的抽象。它负责管理传入的任务并将其传播到可用的线程上。

至于线程本身,它取决于环境,我。即机器,os和jvm。如果你有一个带有一个内核的处理器,或者如果操作系统不支持它,你就不会并行执行任何操作。但是在现代机器上,你肯定会在某种程度上遇到并行执行。请记住,即使您手动创建线程,也不能保证它们将由操作系统并行执行。

答案 1 :(得分:1)

来自Java docs:

  

Executor,提供管理终止的方法和可以生成Future以跟踪一个或多个异步任务进度的方法。

通常, ALL 提交给ExecutorService的Callables将始终与主线程并行运行。对于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”。

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

答案 2 :(得分:0)

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

如果它们是并行处理的,取决于你的机器中有多少cpu可用单位,并且这些cpu的确切用法是程序员无法控制的。