首页 > 其他 > 详细

Future

时间:2021-04-03 13:23:26      阅读:22      评论:0      收藏:0      [点我收藏+]

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,这时也意味着线程执行结束。

 

 

Future

原文:https://www.cnblogs.com/Leeyoung888/p/14613427.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!