ExecutorService vs Casual Thread Spawner
我有一个关于Java中如何工作的基本问题。ExecutorService
很难看出简单地创建以并行执行某些任务与将每个任务分配给 .Threads
ThreadPool
它看起来也非常简单高效,所以我想知道为什么我们不一直使用它。ExecutorService
这是否只是一种方式比另一种方式更快地执行其工作的问题?
这里有两个非常简单的例子来说明这两种方式之间的区别:
使用执行器服务:Hello World(任务)
static class HelloTask implements Runnable {
String msg;
public HelloTask(String msg) {
this.msg = msg;
}
public void run() {
long id = Thread.currentThread().getId();
System.out.println(msg + " from thread:" + id);
}
}
使用执行器服务:Hello World(创建执行器,提交)
static class HelloTask {
public static void main(String[] args) {
int ntasks = 1000;
ExecutorService exs = Executors.newFixedThreadPool(4);
for (int i=0; i<ntasks; i++) {
HelloTask t = new HelloTask("Hello from task " + i);
exs.submit(t);
}
exs.shutdown();
}
}
下面显示了一个类似的示例,但扩展了可调用接口,您能告诉我两者之间的区别以及哪种情况下应该使用特定的接口而不是另一个接口吗?
使用执行器服务:计数器(任务)
static class HelloTaskRet implements Callable<Long> {
String msg;
public HelloTaskRet(String msg) {
this.msg = msg; }
public Long call() {
long tid = Thread.currentThread().getId();
System.out.println(msg + " from thread:" + tid);
return tid;
}
}
使用执行器服务:(创建、提交)
static class HelloTaskRet {
public static void main(String[] args) {
int ntasks = 1000;
ExecutorService exs = Executors.newFixedThreadPool(4);
Future<Long>[] futures = (Future<Long>[]) new Future[ntasks];
for (int i=0; i<ntasks; i++) {
HelloTaskRet t = new HelloTaskRet("Hello from task " + i);
futures[i] = exs.submit(t);
}
exs.shutdown();
}
}