Java 5 以前實現多線程有兩種實現方法:一種是繼承 Thread 類;另一種是實現
Runnable 接口。兩種方式都要通過重寫 run()方法來定義線程的行為,推薦使用
后者,因為 Java 中的繼承是單繼承,一個類有一個父類,如果繼承了 Thread 類
就無法再繼承其他類了,顯然使用 Runnable 接口更為靈活。
補充:Java 5 以后創建線程還有第三種方式:實現 Callable 接口,該接口中的 call
方法可以在線程執行結束時產生一個返回值,代碼如下所示:
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
class MyTask implements Callable<Integer> {
第 276 頁 共 485 頁private int upperBounds;
public MyTask(int upperBounds) {
this.upperBounds = upperBounds;
}
@Override
public Integer call() throws Exception {
int sum = 0;
for(int i = 1; i <= upperBounds; i++) {
sum += i;
}
return sum;
}
}
class Test {
public static void main(String[] args) throws Exception {
List<Future<Integer>> list = new ArrayList<>();
ExecutorService service = Executors.newFixedThreadPool(10);
for(int i = 0; i < 10; i++) {
list.add(service.submit(new MyTask((int) (Math.random() *
100))));
}
int sum = 0;
for(Future<Integer> future : list) {
// while(!future.isDone()) ;
sum += future.get();
第 277 頁 共 485 頁}
System.out.println(sum);
}
}