使用执行器服务
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"。
注意:我确定之前有人问过这个问题,但我找不到与此问题非常相似的任何内容。
执行器服务运行中的线程是否并行并且在向它们提交任务时不分时?如果他们不 运行 并行那么执行程序服务有什么用?
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"。
注意:我确定之前有人问过这个问题,但我找不到与此问题非常相似的任何内容。