Java多執行緒-----建立執行緒的三種方式
阿新 • • 發佈:2018-12-17
1.繼承Thread類建立執行緒
- 定義Thread類的子類,並重寫該類的run()方法,該方法的方法體就是執行緒需要完成的任務,run()方法也稱為執行緒執行體
- 建立Thread子類的例項,也就是建立了執行緒物件
- 啟動執行緒,即呼叫執行緒的start()方法
package com.practise.thread; public class InheritThread extends Thread { @Override public void run() { for (int i = 1; i <= 20; i++) { System.out.println(Thread.currentThread().getName()+ ":" + i); } } } package com.practise.thread; public class ThreadTest { public static void main(String[] args) { //執行緒類 InheritThread inheritThread = new InheritThread(); inheritThread.setName("執行緒一");//設定執行緒名稱 inheritThread.start();//主執行緒 Thread.currentThread().setName("主執行緒"); for (int i = 1; i <= 20; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } }
2.實現Runnable介面建立執行緒
- 定義Runnable介面的實現類,一樣要重寫run()方法,這個run()方法和Thread中的run()方法一樣是執行緒的執行體
- 建立Runnable實現類的例項,並用這個例項作為Thread的target來建立Thread物件,這個Thread物件才是真正的執行緒物件
- 呼叫執行緒物件的start()方法來啟動執行緒
package com.practise.thread; public class ImplementRunnable implements Runnable { @Override public void run() { for (int i = 1; i <= 20; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } } package com.practise.thread; public class ThreadTest { public static void main(String[] args) { //實現Runnable介面 ImplementRunnable implementRunnable=new ImplementRunnable(); Thread thread=new Thread(implementRunnable); thread.setName("執行緒二"); thread.start(); //主執行緒 Thread.currentThread().setName("主執行緒"); for (int i = 1; i <= 20; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } }
3.使用Callable和Future建立執行緒
- 建立Callable介面的實現類,並實現call()方法,然後建立該實現類的例項(從java8開始可以直接使用Lambda表示式建立Callable物件)
- 使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了Callable物件的call()方法的返回值
- 使用FutureTask物件作為Thread物件的target建立並啟動執行緒(因為FutureTask實現了Runnable介面)
- 呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返回值
package com.practise.createthread; import java.util.concurrent.Callable; public class ImplementCallable implements Callable<Integer> { @Override public Integer call() { Integer total = 0; try { for (int i = 1; i <= 50; i++) { total += i; } return total; } catch (Exception ex) { ex.printStackTrace(); } return null; } } package com.practise.createthread; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class ThreadTest { public static void main(String[] args) { ImplementCallable implementCallable=new ImplementCallable(); FutureTask<Integer> task=new FutureTask<Integer>(implementCallable); Thread thread=new Thread(task,"有返回值的執行緒"); thread.start(); try { System.out.println(task.get()); } catch (Exception ex) { ex.printStackTrace(); } Thread.currentThread().setName("主執行緒"); for (int i = 1; i <= 20; i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } }