我有一個關於ExecutorService
如何在Java中工作的基本問題。ExecutorService vs Casual Thread Spawner
很難看出簡單地創建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();}}
下面顯示了一個類似的例子,但是擴展了Callable接口,可以告訴我兩者之間的區別,在哪些情況下應該使用特定的一個而不是另一個?
使用執行人服務:計數器(任務)
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();
}}
這兩個示例都使用'ExecutorService'而不是創建新的線程,所以我不確定在這種情況下兩個示例之間的比較。你對使用'Runnable'何時使用'Callable'感到困惑嗎? – 2014-11-14 20:52:27