Java使用Thread類別代表線程,所有的線程物件都必須是Thread類別或其子類別的實例。 Java可以用三種方式來建立線程,如下所示:
1)繼承Thread類別建立線程
#2)實作Runnable介面建立執行緒
3)使用Callable和Future創建線程
下面讓我們分別來看看這三種創建線程的方法。
繼承Thread類別建立執行緒步驟如下:
1】d定義Thread類別的子類,並重寫該類別的run()方法,該方法的方法體就是執行緒需要完成的任務,run()方法也稱為執行緒執行體。
2】創建Thread子類別的實例,也就是創建了線程物件
3】啟動線程,也就是呼叫線程的start()方法
範例:
public class MyThread extends Thread{//继承Thread类 public void run(){ //重写run方法 } } public class Main { public static void main(String[] args){ new MyThread().start();//创建并启动线程 } }
實作Runnable介面建立執行緒步驟如下:
1】定義Runnable介面的實作類,一樣要重寫run()方法,這個run()方法和Thread中的run()方法一樣是線程的執行體
2】創建Runnable實現類別的實例,並用這個實例作為Thread的target來創建Thread對象,這個Thread對象才是真正的線程物件
3】第三部依然是透過呼叫執行緒物件的start()方法來啟動執行緒
#範例:
public class MyThread2 implements Runnable {//实现Runnable接口 public void run(){ //重写run方法 } } public class Main { public static void main(String[] args){ //创建并启动线程 MyThread2 myThread=new MyThread2(); Thread thread=new Thread(myThread); thread().start(); //或者 new Thread(new MyThread2()).start(); } }
使用Callable和Future建立執行緒步驟如下:
1】建立Callable介面的實作類,並實作call()方法,然後建立該實作類別的實例(從java8開始可以直接使用Lambda表達式建立Callable物件)。
2】使用FutureTask類別來包裝Callable對象,FutureTask物件封裝了Callable物件的call()方法的傳回值
3】使用FutureTask物件作為Thread物件的target建立並啟動執行緒(因為FutureTask實作了Runnable介面)
4】呼叫FutureTask物件的get()方法來取得子執行緒執行結束後的回傳值
範例:
public class Main { public static void main(String[] args){ MyThread3 th=new MyThread3(); //使用Lambda表达式创建Callable对象 //使用FutureTask类来包装Callable对象 FutureTask<Integer> future=new FutureTask<Integer>( (Callable<Integer>)()->{ return 5; } ); new Thread(task,"有返回值的线程").start();//实质上还是以Callable对象来创建并启动线程 try{ System.out.println("子线程的返回值:"+future.get());//get()方法会阻塞,直到子线程执行结束才返回 }catch(Exception e){ ex.printStackTrace(); } } }
更多java知識請關注java基礎教學欄。
以上是java如何創建線程的詳細內容。更多資訊請關注PHP中文網其他相關文章!