1. 程式人生 > >建立執行緒的第三種方式以及簡單使用

建立執行緒的第三種方式以及簡單使用

一、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);
    }
}