java執行緒的3種建立方式
Java使用Thread類代表執行緒,所有的執行緒物件都必須是Thread類或其子類的例項。Java可以用三種方式來建立執行緒,如下所示:
1)繼承Thread類建立執行緒
2)實現Runnable介面建立執行緒
3)實現Callable介面建立執行緒
4)通過執行緒池的方式建立(這裡不通過程式碼演示)在後期的持久化會提到
------------------------繼承Thread類建立執行緒---------------------
通過繼承Thread類來建立並啟動多執行緒的一般步驟如下
1】定義Thread類的子類,並重寫該類的run()
2】建立Thread子類的例項,也就是建立了執行緒物件
3】啟動執行緒,即呼叫執行緒的start()方法
程式碼例項
// 繼承Thread類,重寫run方法 class ThreadA extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(this.getName() + "ThreadA:" + i); try { Thread.sleep(20); } catch (InterruptedException e) { e.getStackTrace(); } } } }
------------------------實現Runnable介面建立執行緒---------------------
通過實現Runnable介面建立並啟動執行緒一般步驟如下:
1】定義Runnable介面的實現類,一樣要重寫run()方法,這個run()方法和Thread中的run()方法一樣是執行緒的執行體
2】建立Runnable實現類的例項,並用這個例項作為Thread的target來建立Thread物件,這個Thread物件才是真正的執行緒物件
3】第三部依然是通過呼叫執行緒物件的start()方法來啟動執行緒
程式碼例項
// 實現runnable介面,重寫run方法 class ThreadB implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread() + "ThreadB:" + i); } } }
------------------------使用Callable和Future建立執行緒---------------------
1】建立Callable介面的實現類,並實現call()方法,然後建立該實現類的例項(從java8開始可以直接使用Lambda表示式建立Callable物件)。
2】使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了Callable物件的call()方法的返回值
3】使用FutureTask物件作為Thread物件的target建立並啟動執行緒(因為FutureTask實現了Runnable介面)
4】呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返回值
程式碼例項:
// 實現callable介面,重寫call方法(該方法具有返回值)
class ThreadC implements Callable<String> {
@Override
public String call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread() + "ThreadC:" + i);
}
return "haha";
}
}
最終的測試
public class ThreadCreate {
public static void main(String[] args) {
new ThreadA().start();
new ThreadA().start();
new Thread(new ThreadB()).start();
new Thread(new ThreadB()).start();
FutureTask<String> ft0 = new FutureTask<String>(new ThreadC());
FutureTask<String> ft1 = new FutureTask<String>(new ThreadC());
new Thread(ft0).start();
new Thread(ft1).start();
try {
System.out.println(ft0.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} finally {
System.out.println("finally在haha之後執行");
}
}
}