java线程基础巩固---Thread API综合实战之编写ThreadService实现暴力结束线程
上篇中在最后抛出一个问题,具体问题可以查看此篇【http://www.cnblogs.com/webor2006/p/7995229.html】,这里不再概述,其实要实现这个需求可以用咱们之前学习的守护线程来解决,守护的场景跟我们想要的需求也很类似啦,下面看下如何来实现这样的目标:
首先新建一个类用来包装线程的执行与停止,如下:
public class ThreadService {
/**
* 执行一个线程
**/
public void execute(Runnable task) {
//TODO
}
/**
* 强制停止执行线程,最多等待mills时间,如果超过这个时间则会强制停止
**/
public void shutDown(long mills) {
//TODO
}
}
然后再new一个线程:
public class ThreadService {
private Thread executeThread;
/**
* 执行一个线程
*/
public void execute(Runnable task) {
executeThread = new Thread(new Runnable() {
@Override
public void run() {
}
});
executeThread.start();
}
/**
* 强制停止执行线程,最多等待mills时间,如果超过这个时间则会强制停止
*/
public void shutDown(long mills) {
//TODO
}
}
然后到核心的关键啦,再executeThread时面再new一个守护线程来执行这个task,如下:
public class ThreadService {
private Thread executeThread;
/**
* 执行一个线程
*/
public void execute(Runnable task) {
executeThread = new Thread(new Runnable() {
@Override
public void run() {
Thread runner = new Thread(task);
runner.setDaemon(true);
runner.start();
}
});
executeThread.start();
}
/**
* 强制停止执行线程,最多等待mills时间,如果超过这个时间则会强制停止
*/
public void shutDown(long mills) {
//TODO
}
}
但是此时代码肯定是有问题的,因为:

那如何修改代码能让我们的task执行完之后再让executeThread退出呢?其实很简单,join就派上用场啦:

然后再引进一个flag来判断是否任务执行完:

假设有个任务要执行1个小时,那可能我们等不了这么长时间,于是乎接下来去实现shutDown()来指定多少时间强制性的终止我们的任务,如下:


好了,接下来来调用一下:

编译运行:

那如果我们的任务时间比较短,比如说2秒中,虽然我们终断传的是5秒,那只要执行2秒的任务最终也要等5秒才退出么,下面试验下:

编译运行:

当然不会啦~~所以完美的解决了我们的需求~~这个在实际项目中应该还是有这种类似的需求的~~
java线程基础巩固---Thread API综合实战之编写ThreadService实现暴力结束线程的更多相关文章
- java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期
Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这 ...
- Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)
Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...
- 第二十四节:Java语言基础-讲解数组的综合应用
数组的综合应用 // 打印数组 public static void printArray(int[] arr) { for(int x=0;x<arr.length;x++) { if(x!= ...
- java线程基础巩固---ThreadGroup API学习
ThreadGroup初识: 这次来学习一个新的线程概念---线程组(ThreadGroup),首先从JDK文档中对它进行一个大致的了解,如下: 下面开始用代码来进行说明,对于一个线程来说如果没有指定 ...
- Java自学基础、进阶、项目实战网站推荐
推荐一个自学的好平台,有Java基础,前端,后端,基础的内容都有讲解,还有框架的讲解和实战项目,特别适合自学 JAVA 自学网站 JAVA 练习题 Spring 教程 Mybatis 教程 Sprin ...
- java多线程-------------基础的Thread.CURRNET
总结:感觉不是太难,不过我写出来了,但竟然不理解它的意思?多线程就是多个任务同时进行 public class Test2 { public static void main(String[] arg ...
- java核心技术-多线程之线程基础
说起线程,无法免俗首先要弄清楚的三个概念就是:进程.线程.协程.OK,那什么是进程,什么是线程,哪协程又是啥东西.进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,进程是动态运行着的代 ...
- JAVA线程基础概念及使用
一.线程和进程的区别 在操作系统中所有运行的任务通常对应一个进程,进程是系统进行资源分配和调度的一个独立单位.线程是进程的组成部分,一个进程最少包含一个线程.并发和并行的区别是,并发指的在同一时刻内, ...
- Qt 线程基础(QThread、QtConcurrent、QThreadPool等)
使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使 ...
随机推荐
- python-Web-django-图表统计
下载highchart插件包,放在static下 <script src="/static/highcharts/highcharts.js"></script& ...
- 【FFMPEG】使用ffmpeg类库打开流媒体
版权声明:本文为博主原创文章,未经博主允许不得转载. 使用ffmpeg类库进行开发的时候,打开流媒体(或本地文件)的函数是avformat_open_input(). 其中打开网络流的话,前面要加上函 ...
- python标准库之shutil——可操作权限的文件操作库
转载自:https://www.jb51.net/article/145522.htm shutil模块提供了许多关于文件和文件集合的高级操作,特别提供了支持文件复制和删除的功能. 文件夹与文件操作 ...
- echarts图例的位置及大小,环图中间字
https://blog.csdn.net/qq_34790644/article/details/89308738 Echarts饼状图属性设置大全 https://blog.csdn.net/sl ...
- [转帖]利用nginx实现负载均衡 | 哈希算法,sticky模块实现session粘滞
利用nginx实现负载均衡 | 哈希算法,sticky模块实现session粘滞 2018年08月02日 10:06:03 Minza 阅读数 483 https://blog.csdn.net/ha ...
- VUE-挂载点-实例成员-数据-过滤器-文本指令-事件指令-属性指令-表单指令-01
目录 路飞项目 vue vue 导读 vue 的优势 渐进式框架 引入 vue 实例成员 - 挂载点 el js 对象(字典)补充 实例成员 - 数据 data 实例成员 - 过滤器 filters ...
- CSS和DOM入门
CSS补充: - position - background - hover - overflow - z-index - opacity 示例:输入框右边放置图标 JavaScript: 局部变量 ...
- Codeforces 1239A. Ivan the Fool and the Probability Theory
传送门 注意到连续两个格子如果有相同颜色那么一路过去的都可以确定 比如一开始染了这两个位置: 然后发现后面整片过去都可以确定: 对于横着的情况也是一样,然后就会发现不可能出现横着两个和竖着两个同时都有 ...
- IIS和apache并存windows服务器
方法三: 将apache设为使用80端口,IIS使用其它端口,比如81,然后将apache作为IIS的代理.速度有影响.在httpd.conf里面,取消下面四行的注释:LoadModule proxy ...
- 怎样使用 v-on 指令?
1. Vue 中的 v-on 指令用于绑定 dom 事件 的监听函数. 下面代码实现的是 点击更改文字颜色 的功能. <!DOCTYPE html> <html lang=" ...