【Future】
http://www.gznc.edu.cn/yxsz/jjglxy/book/Java_api/java/util/concurrent/Future.html
【好奇】
(1)future.cancel(mayInterruptIfRunning)的內部實現會是什么樣子的?可以中斷一個線程池里正在執行着的“那一個”任務。
可猜想,必定記錄着具體線程標識,且發了一個中斷信號。
(2)猜測,應該只是發一個中斷信號,可以中斷阻塞中的操作。而如果是while(true); 這樣的占用CPU的非阻塞式操作,是中斷不掉的,也即線程依舊在跑,占用着線程池資源。
【注意】
a). 線程池資源有限,有些任務會submit()不進去,拋異常:java.util.concurrent.RejectedExecutionException
b).只要submit()成功的,無論是線程正在執行,或是在BlockingQueue中等待執行,future.cancel()操作均可中斷掉線程。也即,與其真正執行並無關系,阻塞中或等待被調度執行中,都將被中斷。
【demo示例】
future.cancel中斷阻塞操作:
public class Main {
/** 信號量 */
private Semaphore semaphore = new Semaphore(0); // 1
/** 線程池 */
private ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3));
/** Future */
private Future<String> future ;
public void test(){
future = pool.submit(new Callable<String>() {
@Override
public String call() {
String result = null;
try {
// 同步阻塞獲取信號量
semaphore.acquire();
result = "ok";
} catch (InterruptedException e) {
result = "interrupted";
}
return result;
}
});
String result = "timeout";
try {
// 等待3s
result = future.get(3, TimeUnit.SECONDS);
}catch (Exception e) {
System.out.println("超時異常");
}
// 刪除線程池中任務
boolean cancelResult = future.cancel(true);
System.out.println("result is " + result);
System.out.println("刪除結果:" +cancelResult);
System.out.println("當前active線程數:" +pool.getActiveCount());
}
public static void main(String[] args) {
Main o = new Main();
o.test();
}
}

