Refer to: http://blog.csdn.net/zhangzhaokun/article/details/6615454
Executor就是Runnable和Callable的調(diào)度容器,F(xiàn)uture就是對(duì)于具體的調(diào)度任務(wù)的執(zhí)行結(jié)果進(jìn)行查看,最為關(guān)鍵的是Future可以檢查對(duì)應(yīng)的任務(wù)是否已經(jīng)完成,也可以阻塞在get方法上一直等待任務(wù)返回結(jié)果。Runnable和Callable的差別就是Runnable是沒(méi)有結(jié)果可以返回的,就算是通過(guò)Future也看不到任務(wù)調(diào)度的結(jié)果的。
package com.future.demo;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class RunnableAndCallable2Future {
public static void main(String[] args) {
// 創(chuàng)建一個(gè)執(zhí)行任務(wù)的服務(wù)
ExecutorService executor = Executors.newFixedThreadPool(3);
try {
// 1.Runnable通過(guò)Future返回結(jié)果為空
// 創(chuàng)建一個(gè)Runnable,來(lái)調(diào)度,等待任務(wù)執(zhí)行完畢,取得返回結(jié)果
Future<?> runnable1 = executor.submit(new Runnable() {
@Override
public void run() {
System.out.println("runnable1 running.");
}
});
System.out.println("Runnable1:" + runnable1.get());
// 2.Callable通過(guò)Future能返回結(jié)果
// 提交并執(zhí)行任務(wù),任務(wù)啟動(dòng)時(shí)返回了一個(gè) Future對(duì)象,
// 如果想得到任務(wù)執(zhí)行的結(jié)果或者是異常可對(duì)這個(gè)Future對(duì)象進(jìn)行操作
Future<String> future1 = executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return "result=task1";
}
});
// 獲得任務(wù)的結(jié)果,如果調(diào)用get方法,當(dāng)前線程會(huì)等待任務(wù)執(zhí)行完畢后才往下執(zhí)行
System.out.println("task1: " + future1.get());
// 3. 對(duì)Callable調(diào)用cancel可以對(duì)對(duì)該任務(wù)進(jìn)行中斷
// 提交并執(zhí)行任務(wù),任務(wù)啟動(dòng)時(shí)返回了一個(gè) Future對(duì)象,
// 如果想得到任務(wù)執(zhí)行的結(jié)果或者是異常可對(duì)這個(gè)Future對(duì)象進(jìn)行操作
Future<String> future2 = executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
try {
while (true) {
System.out.println("task2 running.");
Thread.sleep(50);
}
} catch (InterruptedException e) {
System.out.println("Interrupted task2.");
}
return "task2=false";
}
});
// 等待5秒后,再停止第二個(gè)任務(wù)。因?yàn)榈诙€(gè)任務(wù)進(jìn)行的是無(wú)限循環(huán)
Thread.sleep(10);
System.out.println("task2 cancel: " + future2.cancel(true));
// 4.用Callable時(shí)拋出異常則Future什么也取不到了
// 獲取第三個(gè)任務(wù)的輸出,因?yàn)閳?zhí)行第三個(gè)任務(wù)會(huì)引起異常
// 所以下面的語(yǔ)句將引起異常的拋出
Future<String> future3 = executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
throw new Exception("task3 throw exception!");
}
});
System.out.println("task3: " + future3.get());
} catch (Exception e) {
System.out.println(e.toString());
}
// 停止任務(wù)執(zhí)行服務(wù)
executor.shutdownNow();
}
}
-----------------------------------------------------
Silence, the way to avoid many problems;
Smile, the way to solve many problems;