一、Callable介面

  與繼承Thread和實現Runnable介面方式建立執行緒相比,有以下兩點不同:

  • 可以有返回值,並且能夠獲取返回值
  • call()方法允許丟擲異常

二、簡單使用

package com.duchong.thread.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * @author DUCHONG
 * @since 2019-01-03 11:23
 **/
public class CallableMain {


    public static void main(String[] args)throws Exception{

        FutureTask<Integer> futureTask=new FutureTask<Integer>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                //業務邏輯
                Integer sum=0;
                for (int i=1;i<=100;i++){
                    sum+=i;
                }
                return sum;
            }
        });

        new Thread(futureTask).start();

        Integer callResult=futureTask.get();

        System.out.println(callResult);
    }
}
FutureTask可以看做Runnable和Future的實現類,所以可以作為Thread類的入參。

三、配合執行緒池的簡單使用

package com.duchong.thread.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 有返回值的Runnable
 *
 * @author DUCHONG
 * @since 2018-07-19 14:15
 **/
public class CallThread {


    public static void main(String[] args) throws Exception
    {
        ExecutorService es = Executors.newCachedThreadPool();

        Future<String> f = es.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "hello callable";
            }
        });

        es.shutdown();
        //獲取返回值
        String str = f.get();

        System.out.println(str);
    }
}