建立執行緒的第三種方式以及簡單使用
阿新 • • 發佈:2019-01-03
一、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); } }