介紹
Java創(chuàng)建線(xiàn)程的三種方式:
- 直接繼承Thread
- 通過(guò)Runnable實(shí)現(xiàn)
- 通過(guò)FutureTask和Callable實(shí)現(xiàn)
一、直接繼承Thread
方法
定義一個(gè)類(lèi)(比如:FirstThreadTest)繼承于 Thread 類(lèi)。
public class FirstThreadTest extends Thread {
@Override
public void run() {
System.out.println("執(zhí)行 " + getName() + " 線(xiàn)程");
}
}
使用
FirstThreadTest thread1 = new FirstThreadTest();
thread1.run();
FirstThreadTest thread2 = new FirstThreadTest();
thread2.run();
輸出
執(zhí)行 Thread-0 線(xiàn)程
執(zhí)行 Thread-1 線(xiàn)程
二、通過(guò)Runnable實(shí)現(xiàn)
方法
定義一個(gè)類(lèi)(比如:RunnableThreadTest),實(shí)現(xiàn) Runnable 接口。
public class RunnableThreadTest implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; ++i) {
System.out.println("執(zhí)行 " + Thread.currentThread().getName() + ", i = " + i);
}
}
}
使用
RunnableThreadTest runnableThreadTest = new RunnableThreadTest();
new Thread(runnableThreadTest, "新線(xiàn)程1").start();
new Thread(runnableThreadTest, "新線(xiàn)程2").start();
輸出
執(zhí)行 新線(xiàn)程1, i = 0
執(zhí)行 新線(xiàn)程2, i = 0
執(zhí)行 新線(xiàn)程2, i = 1
執(zhí)行 新線(xiàn)程2, i = 2
執(zhí)行 新線(xiàn)程2, i = 3
執(zhí)行 新線(xiàn)程2, i = 4
執(zhí)行 新線(xiàn)程1, i = 1
執(zhí)行 新線(xiàn)程2, i = 5
執(zhí)行 新線(xiàn)程1, i = 2
執(zhí)行 新線(xiàn)程2, i = 6
執(zhí)行 新線(xiàn)程1, i = 3
執(zhí)行 新線(xiàn)程2, i = 7
執(zhí)行 新線(xiàn)程1, i = 4
執(zhí)行 新線(xiàn)程1, i = 5
執(zhí)行 新線(xiàn)程2, i = 8
執(zhí)行 新線(xiàn)程1, i = 6
執(zhí)行 新線(xiàn)程1, i = 7
執(zhí)行 新線(xiàn)程2, i = 9
執(zhí)行 新線(xiàn)程1, i = 8
執(zhí)行 新線(xiàn)程1, i = 9
(備注:因?yàn)槭嵌嗑€(xiàn)程,輸出的結(jié)果可能不一定完全一致。)
三、通過(guò)FutureTask和Callable實(shí)現(xiàn)
方法
定義一個(gè)類(lèi)(比如:CallableThreadTest)實(shí)現(xiàn) Callable 接口。
另外,call 方法具有返回值,執(zhí)行結(jié)束后可將結(jié)果返回給調(diào)用方。
public class CallableThreadTest implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int i = 0;
for(;i < 10; ++i) {
System.out.println("執(zhí)行 " + Thread.currentThread().getName() + ",i = " + i);
}
return i;
}
}
使用
CallableThreadTest callableThreadTest = new CallableThreadTest();
FutureTask<Integer> futureTask = new FutureTask<>(callableThreadTest);
new Thread(futureTask, "有返回值的線(xiàn)程").start();
try {
System.out.println("子線(xiàn)程的返回值:" + futureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
輸出
執(zhí)行 有返回值的線(xiàn)程,i = 0
執(zhí)行 有返回值的線(xiàn)程,i = 1
執(zhí)行 有返回值的線(xiàn)程,i = 2
執(zhí)行 有返回值的線(xiàn)程,i = 3
執(zhí)行 有返回值的線(xiàn)程,i = 4
執(zhí)行 有返回值的線(xiàn)程,i = 5
執(zhí)行 有返回值的線(xiàn)程,i = 6
執(zhí)行 有返回值的線(xiàn)程,i = 7
執(zhí)行 有返回值的線(xiàn)程,i = 8
執(zhí)行 有返回值的線(xiàn)程,i = 9
子線(xiàn)程的返回值:10