【多執行緒】採用Callable介面建立執行緒
阿新 • • 發佈:2019-02-07
前言
java5開始,提供了Callable介面,是Runable介面的增強版。同樣用Call()方法作為執行緒的執行體,增強了之前的run()方法。因為call方法可以有返回值,也可以宣告丟擲異常。
Future介面:
java5提供了Future介面來代表Callable接口裡的call()方法的返回值,併為Future介面提供了一個FutureTask實現類,該實現類實現了Future介面,並實現了Runnable介面,所以這樣可以作為Thread的target。
步驟
1.建立Callable的實現類,並衝寫call()方法,該方法為執行緒執行體,並且該方法有返回值
2.建立Callable的例項,並用FutuerTask類來包裝Callable物件,該FutuerTask封裝了Callable物件call()方法的返回值
3.例項化FutuerTask類,引數為FutuerTask介面實現類的物件來啟動執行緒
4.通過FutuerTask類的物件的get()方法來獲取執行緒結束後的返回值
程式碼實現
第一種:用lambda表示式
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; /** * 使用Callable介面來建立執行緒 */ public class NewThread { public static void main(String[] args) { //先使用Lambda表示式建立Callable<Integer>物件, //並使用FutureTask來包裝Callable物件 FutureTask<Integer> task=new FutureTask<Integer>((Callable<Integer>)()->{ //這裡相當於call方法執行體。 int i=0; for (i = 0; i <10 ; i++) { System.out.println(Thread.currentThread().getName()+"====="+i); } return i; }); //建立一個執行緒,並start啟動它。 for (int i = 0; i <10 ; i++) { System.out.println(Thread.currentThread().getName()+"======="+i); if(i==0){ Thread t1=new Thread(task,"我是fu執行緒"); t1.start(); } } //得到返回值,注意這個必須要有顯示丟擲異常 try{ System.out.println("子執行緒的返回值"+task.get()); }catch (Exception e){ e.printStackTrace(); } } }
執行結果:
第二種方法:普通建立執行緒的方式
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; //不用lambda表示式,就是這樣,先建立一個callable的實現類。 public class CallableTest implements Callable<Integer>{ //重寫執行體call() @Override public Integer call() throws Exception { int i=0; for(;i<10;i++){ //當前執行緒 System.out.println("當前執行緒是:::"+Thread.currentThread() +":"+i); } return i; } public static void main(String[] args) { //建立callable物件 CallableTest call=new CallableTest(); FutureTask<Integer> fu=new FutureTask<Integer>(call); Thread th=new Thread(fu,"我是fu執行緒"); for (int i = 0; i < 3; i++) { //當前執行緒 System.out.println(Thread.currentThread().getName()+"當前執行緒"); if(i==0){ th.start(); } } //得到返回值 try { System.out.println("返回值是:" + fu.get()); } catch (Exception e) { e.printStackTrace(); } } }
執行結果: