利用线程池为线程创建一个守护线程
主线程:
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()方法本身是个阻塞方法,是在线程池任务结束后才执行的,以便获取实际返回值(毕竟线程任务如果是查询任务,我们需要其实际返回值)。
利用线程池为线程创建一个守护线程相关推荐
- 并发编程——线程——线程的理论和创建以及守护线程
一.什么是线程 线程是操作系统能够进行运算调度的最小单位. 它被包含在进程之中,是进程中的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任 ...
- 线程池是如何重复利用空闲的线程来执行任务的?
来源:blog.csdn.net/anhenzhufeng/article/details/88870374 在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,但如果并发的线程数量 ...
- 面试官问:线程池是如何重复利用空闲的线程来执行任务的?
欢迎关注方志朋的博客,回复"666"获面试宝典 在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,但如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任 ...
- 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...
我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就是在实际开发中 ...
- Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义
为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...
- 一篇文章带你搞定线程池的自定义创建和扩展
文章目录 一.自定义线程创建:ThreadFactory 二.扩展线程池 一.自定义线程创建:ThreadFactory 看了那么多有关线程池的介绍,不知道大家有没有思考过一个基本的问题:线程池中的线 ...
- 手写一个线程池,带你学习ThreadPoolExecutor线程池实现原理
摘要:从手写线程池开始,逐步的分析这些代码在Java的线程池中是如何实现的. 本文分享自华为云社区<手写线程池,对照学习ThreadPoolExecutor线程池实现原理!>,作者:小傅哥 ...
- 线程池介绍及创建线程池的4种方式
1. 什么是线程池 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 第一:降低资源消耗.通过重复利 ...
- 线程池原理及创建(C++实现)
本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关.另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整线程池中线程的数量.文章的最后,我们 ...
最新文章
- C# 框架是什么?MVC是什么 ?工厂模式是什么?设计模式是什么?三层架构是什...
- hexo+git维护笔记
- [javaSE] 数组(排序-冒泡排序)
- 前端开发学习的基础网站
- 【DP】【高精】幸运票 (jzoj 2122)
- 福利 | 2018 OpenInfra Days China限量版免费票任性放出
- 首次!阿里达摩院将Pure Transformer 应用于目标重识别ReID!
- linux设备模型(8)_platform设备,Linux设备模型之platform总线
- FAT32文件系统详解
- matlab仿真模糊PID控制,模糊PID控制及其MATLAB仿真
- 张宇:7~12月考研数学该如何复习?
- basler相机详细使用说明
- 摄像头各参数的意义_详解:监控摄像头参数介绍说明 | 58监控网
- python colormap 顺滑_Python matplotlib Colormap规范化许多接近值的范围
- happen-before讲解
- 未能联接game center服务器,苹果game center无法连接服务器怎么办呢?
- 用计算机怎样提交作业,学而思培优如何提交作业 学而思培优在线操作说明之五步法...
- 程序员兼职接私活平台大全,兼职也能月薪上万
- LockSupport 的 park 和 unpark 以及线程中断对 park 的影响
- 基于Java(Jsp+servelet+Javabean)+MySQL实现图书管理系统【100010229】