主线程:

public class MainThread implements Callable {SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS" );@Overridepublic Integer call() throws Exception {for (int i = 0; i < 10; i++) {Thread.sleep(200*i);Date now= new Date();System.out.println(Thread.currentThread() +":"+sdf.format(now));}return 0;}
}

守护线程:

public class DeamonThread implements Callable<String> {private Future<Integer> mainThread;SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );public DeamonThread() {}public DeamonThread(Future<Integer> mainThread) {this.mainThread = mainThread;}@Overridepublic String call() throws Exception {try{//如果主线程已执行完,则不在这里浪费时间if(!mainThread.isDone() || !mainThread.isCancelled()){//如果主线程执行超过2s,执行守护线程finally语句内代码Thread.sleep(2000);System.out.println("守护线程等待了2s");}}catch (InterruptedException e){}finally {if(!mainThread.isDone() || !mainThread.isCancelled()){mainThread.cancel(true);}System.out.println("主线程执行超时,主线程结束");}return "";}
}

测试:

public class ThreadPoolDemo {public static void main(String[] args) {ThreadPoolExecutor threadPoolExecutor = null;try {MainThread mainThread = new MainThread();threadPoolExecutor = new ThreadPoolExecutor(2, 2, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1));Future<Integer> mainResult = threadPoolExecutor.submit(mainThread);DeamonThread deamonThread1 = new DeamonThread(mainResult);threadPoolExecutor.submit(deamonThread1);System.out.println("*****"+mainResult.get()+"*****");}catch (Exception e){}finally {if(threadPoolExecutor!=null){threadPoolExecutor.shutdown();}}}
}

主线程执行超过2s任务被取消:

细心的话可以发现:

System.out.println("*****"+mainResult.get()+"*****");

这句代码没执行,查看原因


可以看出是调用mainResult.get()方法时发生CancellationException异常(由于任务执行中断,被取消)

Future<Integer> mainResult = threadPoolExecutor.submit(mainThread);
DeamonThread deamonThread1 = new DeamonThread(mainResult);
threadPoolExecutor.submit(deamonThread1);

另外,线程池中,不同任务间是竞争执行的,不会按代码顺序去一步一步执行,所以守护线程可以在主线程执行过程中得到主线程返回的Future mainResult对象。
除了多线程任务执行无序,事实上当前main方法线程和线程池中的多线程任务也会并发执行,修改部分代码:


可以看出,先把main方法中for循环代码执行了(耗时较短,瞬间执行完毕,如果与线程池任务耗时相当,则可看见交替执行效果),而System.out.println("*****"+mainResult.get()+"*****");后边的for语句因为get()方法抛异常,未被执行。而get()方法本身是个阻塞方法,是在线程池任务结束后才执行的,以便获取实际返回值(毕竟线程任务如果是查询任务,我们需要其实际返回值)。

利用线程池为线程创建一个守护线程相关推荐

  1. 并发编程——线程——线程的理论和创建以及守护线程

    一.什么是线程 线程是操作系统能够进行运算调度的最小单位. 它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任 ...

  2. 线程池是如何重复利用空闲的线程来执行任务的?

    来源:blog.csdn.net/anhenzhufeng/article/details/88870374 在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,但如果并发的线程数量 ...

  3. 面试官问:线程池是如何重复利用空闲的线程来执行任务的?

    欢迎关注方志朋的博客,回复"666"获面试宝典 在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,但如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任 ...

  4. 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...

    我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就是在实际开发中 ...

  5. Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义

    为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...

  6. 一篇文章带你搞定线程池的自定义创建和扩展

    文章目录 一.自定义线程创建:ThreadFactory 二.扩展线程池 一.自定义线程创建:ThreadFactory 看了那么多有关线程池的介绍,不知道大家有没有思考过一个基本的问题:线程池中的线 ...

  7. 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理

    摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...

  8. 线程池介绍及创建线程池的4种方式

    1. 什么是线程池 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 第一:降低资源消耗.通过重复利 ...

  9. 线程池原理及创建(C++实现)

    本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关.另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整线程池中线程的数量.文章的最后,我们 ...

最新文章

  1. C# 框架是什么?MVC是什么 ?工厂模式是什么?设计模式是什么?三层架构是什...
  2. hexo+git维护笔记
  3. [javaSE] 数组(排序-冒泡排序)
  4. 前端开发学习的基础网站
  5. 【DP】【高精】幸运票 (jzoj 2122)
  6. 福利 | 2018 OpenInfra Days China限量版免费票任性放出
  7. 首次!阿里达摩院将Pure Transformer 应用于目标重识别ReID!
  8. linux设备模型(8)_platform设备,Linux设备模型之platform总线
  9. FAT32文件系统详解
  10. matlab仿真模糊PID控制,模糊PID控制及其MATLAB仿真
  11. 张宇:7~12月考研数学该如何复习?
  12. basler相机详细使用说明
  13. 摄像头各参数的意义_详解:监控摄像头参数介绍说明 | 58监控网
  14. python colormap 顺滑_Python matplotlib Colormap规范化许多接近值的范围
  15. happen-before讲解
  16. 未能联接game center服务器,苹果game center无法连接服务器怎么办呢?
  17. 用计算机怎样提交作业,学而思培优如何提交作业 学而思培优在线操作说明之五步法...
  18. 程序员兼职接私活平台大全,兼职也能月薪上万
  19. LockSupport 的 park 和 unpark 以及线程中断对 park 的影响
  20. 基于Java(Jsp+servelet+Javabean)+MySQL实现图书管理系统【100010229】

热门文章

  1. Ubuntu18.04+CUDA10.2 深度学习开发环境配置指南
  2. 机器学习相关的数学资料下载
  3. 互联网1分钟 | 0327 华为P30系列发布;微信公号直播工具大范围开放内测资格
  4. 互联网1分钟 |1116
  5. Django 应用程序 + 模型 + 基本数据访问
  6. 牛客网 小白赛4 A三角形【贪心】
  7. golang文件操作
  8. 解决ftp上传connection reset错误
  9. 推荐:制作地图的网站和工具
  10. Flex数据绑定陷阱(一)