執行緒的三種建立方式
阿新 • • 發佈:2020-11-03
1. 繼承Thread類
(1)定義Thread類的子類,並重寫run()方法。
(2)建立Thread子類的例項,即建立執行緒物件。
(3)通過呼叫執行緒物件的start()方法啟動該執行緒。
class MyThread extends Thread { @Override public void run() { System.out.println("Thread子類MyThread的執行緒號:" + currentThread().getName()); } } public class Demo { public static void main(String[] args) throws Exception { test(); } public static void test() throws Exception { Thread t1 = new MyThread(); Thread t2 = new MyThread(); t1.start(); t2.start(); } }
2. 實現Runnable介面(常用)
(1)定義Runnable介面的實現類。
(2)建立Runnable的實現類例項,將此例項作為Thread的target來建立Thread物件。
(3)通過呼叫執行緒物件的start()方法啟動該執行緒。
class MyThreadImpl implements Runnable { @Override public void run() { System.out.println("實現Runnable介面的執行緒號:" + Thread.currentThread().getName()); } } public class Demo { public static void main(String[] args) throws Exception { test(); } public static void test() throws Exception { MyThreadImpl mti = new MyThreadImpl(); Thread t1 = new Thread(mti); t1.start(); } }
3.實現Callable介面
(1)定義Callable介面的實現類,並實現call()方法,call()方法有返回值。
(2)建立Callable實現類的例項,使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了該Callable物件的call()方法的返回值。
(3)將FutureTask物件作為Thread物件的target建立執行緒物件,呼叫start()啟動新執行緒。
(4)呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返回值。
class MyThreadCallable implements Callable { @Override public Object call() throws Exception { System.out.println("實現Callable介面的執行緒號:" + Thread.currentThread().getName()); return 10; } } public class Demo { public static void main(String[] args) throws Exception { test(); } public static void test() throws Exception { Callable callable = new MyThreadCallable(); FutureTask ft = new FutureTask(callable); Thread t = new Thread(ft); t.start(); System.out.println(ft.get()); } }