cancel java_Future.cancel()疑难杂症
問題描述
在學習并發編程的時候對Future的cancel有點小疑惑。
future類里面,有cancel()和isCanceled()的兩個方法,前者是發送取消命令給線程并返回是否發送成功,后者是判斷該線程是否被取消。但是在實際運用時出現了一些問題。以下會列出問題:
問題出現的環境背景及自己嘗試過哪些方法
查閱了《java并發編程》,發現書里對isCanceled沒有詳細介紹
相關代碼
問題
1.我對線程發送了cancel命令,但沒有用isInterrupted來截獲cancel命令,也就是說,線程還能一直執行下去。為什么isCanceled()返回了true呢?
public class Test10 {
class MyCallable implements Callable {
@Override
public String call() throws Exception {
int i = 0;
while (i == 0) {
System.out.println("z");
}
return "always run";
}
}
public static void main(String[] args) throws InterruptedException {
Test10 test10 = new Test10();
MyCallable myCallable = test10.new MyCallable();
ExecutorService executorService = new ThreadPoolExecutor(50, Integer.MAX_VALUE, 5, TimeUnit.SECONDS, new LinkedBlockingDeque());
Future future = executorService.submit(myCallable);
Thread.sleep(4000);
System.out.println(future.cancel(true) + " " + future.isCancelled());
}
}
這個是返回結果:
2.當我對sleep的線程發出cancel命令,會發生什么呢?我試了下好像會一直處于sleep狀態了
public class Test10 {
class MyCallable implements Callable {
@Override
public String call() throws Exception {
int i = 0;
while (i == 0) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("截獲中斷");
}
Thread.sleep(1000);
System.out.println("z");
}
return "always run";
}
}
public static void main(String[] args) throws InterruptedException {
Test10 test10 = new Test10();
MyCallable myCallable = test10.new MyCallable();
ExecutorService executorService = new ThreadPoolExecutor(50, Integer.MAX_VALUE, 5, TimeUnit.SECONDS, new LinkedBlockingDeque());
Future future = executorService.submit(myCallable);
Thread.sleep(4000);
System.out.println(future.cancel(true) + " " + future.isCancelled());
}
}
這個是返回結果:
你期待的結果是什么?實際看到的錯誤信息又是什么?
希望有大牛解惑,另外可以推薦一些并發編程的書嗎?我看了《java并發編程:核心方法與框架》以及《java并發編程實戰》了,總感覺學的比較淺。
總結
以上是生活随笔為你收集整理的cancel java_Future.cancel()疑难杂症的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图书查询系统的工作原理
- 下一篇: Springboot异常处理errorC