执行程序服务中的线程是否并行运行,并且在向其提交任务时没有时间片?如果它们没有并行运行那么执行器服务的用途是什么?
答案 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的确切用法是程序员无法控制的。