1. 程式人生 > >【多執行緒】採用Callable介面建立執行緒

【多執行緒】採用Callable介面建立執行緒

前言

      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();
        }
    }
}

執行結果:

對比3種建立執行緒的方式