1. cancel(boolean mayInterruptIfRunning)和isCancelled()
1 package Five_cancel_and_isCancelled; 2 3 import java.util.concurrent.Callable; 4 5 public class MyCallable implements Callable<String> { 6 7 @Override 8 public String call() throws Exception { 9 // TODO Auto-generated method stub 10 System.out.println("begin : " + System.currentTimeMillis()); 11 Thread.sleep(2000); 12 System.out.println("end : " + System.currentTimeMillis()); 13 return "我的年龄是2000"; 14 } 15 16 }
1 package Five_cancel_and_isCancelled; 2 3 import java.util.concurrent.ExecutionException; 4 import java.util.concurrent.ExecutorService; 5 import java.util.concurrent.LinkedBlockingDeque; 6 import java.util.concurrent.ThreadPoolExecutor; 7 import java.util.concurrent.TimeUnit; 8 import java.util.concurrent.Future; 9 10 public class Test { 11 12 public static void main(String[] args) throws InterruptedException, ExecutionException { 13 14 MyCallable mc = new MyCallable(); 15 16 ExecutorService executor = new ThreadPoolExecutor(50, Integer.MAX_VALUE, 5, TimeUnit.SECONDS, 17 new LinkedBlockingDeque<Runnable>()); 18 19 Future<String> f = executor.submit(mc); 20 System.out.println(f.get()); 21 System.out.println(f.cancel(true) + "----------" + f.isCancelled()); 22 } 23 }
运行结果:
分析:
线程已经运行完毕,线程对象已经销毁,所以方法cancel(true)的返回值是false,代表发送中断线程的命令没有成功。因为这个命令中的参数的作用是:如果线程正在运行,则发送中断线程的命令。而线程已经运行结束了,所以没有满足这个命令执行的条件,所以命令没有执行成功。
修改:将这行代码注释掉
//System.out.println(f.get());
运行结果:
true----------true
成功中断正在执行中的线程。
分析:
将这行注释掉,意味着没有取线程的返回值,那么线程就一直在call()方法中运行,直到接到了取返回值的命令,才会走到return,这时也意味着线程执行结束。
原文:https://www.cnblogs.com/Leeyoung888/p/14613427.html