Callable、Future、FutureTask浅析
生活随笔
收集整理的這篇文章主要介紹了
Callable、Future、FutureTask浅析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、Callable<V>接口
Runnable接口
public interface Runnable { public abstract void run(); }Callable
public interface Callable<V> { V call() throws Exception; }runnable接口 Callable接口 都可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor執(zhí)行,兩者實(shí)現(xiàn)了ExcutorService接口
ExecutorService接口
<T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task);2、Future<V>?
獲得異步計(jì)算結(jié)果,說白了就是對(duì)具體的Runnable或者Callable對(duì)象任務(wù)執(zhí)行的結(jié)果進(jìn)行獲取(get()),取消(cancel()),判斷是否完成等操作。
public interface Future<V> {//如果任務(wù)沒開始,cancle()將會(huì)返回true
//如果任務(wù)已經(jīng)啟動(dòng),執(zhí)行cancle(true)將以中斷執(zhí)行此任務(wù)線程的方式來試圖阻止任務(wù),成功返滬true
//如果任務(wù)已經(jīng)啟動(dòng),執(zhí)行cancle(false)將不會(huì)對(duì)執(zhí)行線程產(chǎn)生影響,此時(shí)返回falseboolean cancel(boolean mayInterruptIfRunning);
//如果任務(wù)完成前被取消,返回trueboolean isCancelled();
//如果任務(wù)結(jié)束,無論是正常結(jié)束或是中途取消還是發(fā)生異常,都會(huì)trueboolean isDone();
//獲取異步執(zhí)行結(jié)果,如果沒有結(jié)果可用,此方法會(huì)阻塞直到異步計(jì)算完成。V get() throws InterruptedException, ExecutionException;
//獲取異步執(zhí)行結(jié)果,如果沒有結(jié)果可用,此方法會(huì)阻塞,
//但是會(huì)有時(shí)間限制,如果阻塞時(shí)間超過設(shè)定的timeout時(shí)間,該方法將拋出異常。V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
3、FutureTask類
public class FutureTask<V> implements RunnableFuture<V> {其中
public interface RunnableFuture<V> extends Runnable, Future<V> { void run(); }構(gòu)造方法:
public interface RunnableFuture<V> extends Runnable, Future<V> { void run(); }使用場景:
1、使用Callable+Future獲取執(zhí)行結(jié)果
package com.zejian.Executor; import java.util.concurrent.Callable; /** * @author zejian * @time 2016年3月15日 下午2:02:42 * @decrition Callable接口實(shí)例 */ public class CallableDemo implements Callable<Integer> { private int sum; @Override public Integer call() throws Exception { System.out.println("Callable子線程開始計(jì)算啦!"); Thread.sleep(2000); for(int i=0 ;i<5000;i++){ sum=sum+i; } System.out.println("Callable子線程計(jì)算結(jié)束!"); return sum; } } package com.zejian.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * @author zejian * @time 2016年3月15日 下午2:05:43 * @decrition callable執(zhí)行測試類 */ public class CallableTest { public static void main(String[] args) { //創(chuàng)建線程池 ExecutorService es = Executors.newSingleThreadExecutor(); //創(chuàng)建Callable對(duì)象任務(wù) CallableDemo calTask=new CallableDemo(); //提交任務(wù)并獲取執(zhí)行結(jié)果 Future<Integer> future =es.submit(calTask); //關(guān)閉線程池 es.shutdown(); try { Thread.sleep(2000); System.out.println("主線程在執(zhí)行其他任務(wù)"); if(future.get()!=null){ //輸出獲取到的結(jié)果 System.out.println("future.get()-->"+future.get()); }else{ //輸出獲取到的結(jié)果 System.out.println("future.get()未獲取到結(jié)果"); } } catch (Exception e) { e.printStackTrace(); } System.out.println("主線程在執(zhí)行完成"); } }執(zhí)行結(jié)果:
Callable子線程開始計(jì)算啦! 主線程在執(zhí)行其他任務(wù) Callable子線程計(jì)算結(jié)束! future.get()-->12497500 主線程在在執(zhí)行完成2、使用Callable+FutureTask獲取執(zhí)行結(jié)果
package com.zejian.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; /** * @author zejian * @time 2016年3月15日 下午2:05:43 * @decrition callable執(zhí)行測試類 */ public class CallableTest { public static void main(String[] args) { //創(chuàng)建線程池 ExecutorService es = Executors.newSingleThreadExecutor(); //創(chuàng)建Callable對(duì)象任務(wù) CallableDemo calTask=new CallableDemo(); //創(chuàng)建FutureTask FutureTask<Integer> futureTask=new FutureTask<>(calTask); //執(zhí)行任務(wù) es.submit(futureTask); //關(guān)閉線程池 es.shutdown(); try { Thread.sleep(2000); System.out.println("主線程在執(zhí)行其他任務(wù)"); if(futureTask.get()!=null){ //輸出獲取到的結(jié)果 System.out.println("futureTask.get()-->"+futureTask.get()); }else{ //輸出獲取到的結(jié)果 System.out.println("futureTask.get()未獲取到結(jié)果"); } } catch (Exception e) { e.printStackTrace(); } System.out.println("主線程在執(zhí)行完成"); } }結(jié)果:
Callable子線程開始計(jì)算啦! 主線程在執(zhí)行其他任務(wù) Callable子線程計(jì)算結(jié)束! futureTask.get()-->12497500 主線程在執(zhí)行完成?
轉(zhuǎn)載于:https://www.cnblogs.com/L-a-u-r-a/p/8570080.html
總結(jié)
以上是生活随笔為你收集整理的Callable、Future、FutureTask浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习---html基础知识
- 下一篇: 通用mapper和分类实现