当前位置:   article > 正文

java多线程Future.cancel(true)取消线程,线程还是会执行catch与finally里面的代码,只要资源回收的代码没有乱写,不必担心资源回收问题

future.cancel(true)

1.代码展示

  1. public static void main(String[] args) {
  2. //定义线程池
  3. ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 30, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
  4. //信号量定义
  5. CountDownLatch countDownLatch = new CountDownLatch(2);
  6. //提交异步任务1
  7. Future<Integer> future1 = threadPoolExecutor.submit(() -> {
  8. try {
  9. System.out.println("任务1获取连接");
  10. Thread.sleep(1000);
  11. System.out.println("任务1开始处理查询结果");
  12. return 1 ;
  13. } catch (Exception e){
  14. System.out.println("任务1catch="+e.getMessage());
  15. return null ;
  16. }finally {
  17. //信号量递减
  18. countDownLatch.countDown();
  19. System.out.println("任务1归还连接");
  20. }
  21. });
  22. //提交异步任务2
  23. Future<Integer> future2 = threadPoolExecutor.submit(() -> {
  24. try {
  25. System.out.println("任务2获取连接");
  26. Thread.sleep(20000);
  27. System.out.println("任务2开始处理查询结果");
  28. return 2 ;
  29. } catch (Exception e){
  30. System.out.println("任务2catch="+e.getMessage());
  31. return null ;
  32. }finally {
  33. //信号量递减
  34. countDownLatch.countDown();
  35. System.out.println("任务2归还连接");
  36. }
  37. });
  38. //等待都执行完成
  39. try {
  40. countDownLatch.await(2, TimeUnit.SECONDS);
  41. } catch (InterruptedException e) {
  42. e.printStackTrace();
  43. }
  44. System.out.println("*****************************开始打印执行结果*********************************");
  45. if(future1.isDone()){
  46. Integer integer = null;
  47. try {
  48. integer = future1.get();
  49. } catch (Exception e) {
  50. e.printStackTrace();
  51. }
  52. System.out.println("任务1执行结果="+integer);
  53. }else {
  54. System.out.println("任务1执行结果=null");
  55. future1.cancel(true);
  56. }
  57. if(future2.isDone()){
  58. Integer integer = null;
  59. try {
  60. integer = future2.get();
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. }
  64. System.out.println("任务2执行结果="+integer);
  65. }else {
  66. System.out.println("任务2执行结果=null");
  67. future2.cancel(true);
  68. }
  69. }

2.执行结果

  1. 任务1获取连接
  2. 任务2获取连接
  3. 任务1开始处理查询结果
  4. 任务1归还连接
  5. *****************************开始打印执行结果*********************************
  6. 任务1执行结果=1
  7. 任务2执行结果=null
  8. 任务2catch=sleep interrupted
  9. 任务2归还连接

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号