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);
}
}