多執行緒建立方式三之實現Callable介面
阿新 • • 發佈:2019-01-10
Callable 介面
Java 5.0 在java.util.concurrent 提供了一個新的建立執行執行緒的方式:Callable 介面
Callable 介面類似於Runnable,兩者都是為那些其例項可能被另一個執行緒執行的類設計的。但是Runnable 不會返回結果,並且無法丟擲經過檢查的異常。
Callable 需要依賴FutureTask ,FutureTask 也可以用作閉鎖。
示例程式碼如下:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class TestCallable {
public static void main(String[] args) {
Callable<Integer>callable = new MyCallable();
FutureTask<Integer>task[] = new FutureTask[10];
long start = System.currentTimeMillis();
for(int i=0;i<10;i++){
task[i] = new FutureTask<Integer>(callable);
new Thread(task[i]).start();
}
int num = 0;
while(num<10){
try {
System.out.println(task[num].get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
num++;
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
return sum;
}
}
程式碼分析:
main執行緒裡,有三個執行緒,三個執行緒獨立,task.get()只有等待對應執行緒完成後才會執行,兩個for迴圈序列,第二個for迴圈相當於閉鎖。所以最後可以打印出10個結果。而且,效率明顯比序列執行10次迴圈效率高。
流程圖分析: