Java 5之前實現多線程有兩種實現方法:一種是繼承Thread類;另外一種是實現Runnable接口。java
兩種方式都要經過重寫run()方法來定義線程的行爲,推薦使用後者,由於Java中的繼承是單繼承,一個類有一個父類,若是繼承了Thread類就沒法再繼承其餘類了,顯然使用Runnable接口更爲靈活多線程
補充:Java 5之後建立線程還有第三種方式:實現Callable接口,該接口中的call方法能夠在線程執行結束時產生一個返回值,代碼以下所示:dom
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> {
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();
}
System.out.println(sum);
}
}