上篇中在最后抛出一个问题,具体问题可以查看此篇【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实现暴力结束线程的更多相关文章

  1. java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期

    Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这 ...

  2. Qt 线程基础(Thread Basics的翻译,线程的五种使用情况)

    Qt 线程基础(QThread.QtConcurrent等) 转载自:http://blog.csdn.net/dbzhang800/article/details/6554104 昨晚看Qt的Man ...

  3. 第二十四节:Java语言基础-讲解数组的综合应用

    数组的综合应用 // 打印数组 public static void printArray(int[] arr) { for(int x=0;x<arr.length;x++) { if(x!= ...

  4. java线程基础巩固---ThreadGroup API学习

    ThreadGroup初识: 这次来学习一个新的线程概念---线程组(ThreadGroup),首先从JDK文档中对它进行一个大致的了解,如下: 下面开始用代码来进行说明,对于一个线程来说如果没有指定 ...

  5. Java自学基础、进阶、项目实战网站推荐

    推荐一个自学的好平台,有Java基础,前端,后端,基础的内容都有讲解,还有框架的讲解和实战项目,特别适合自学 JAVA 自学网站 JAVA 练习题 Spring 教程 Mybatis 教程 Sprin ...

  6. java多线程-------------基础的Thread.CURRNET

    总结:感觉不是太难,不过我写出来了,但竟然不理解它的意思?多线程就是多个任务同时进行 public class Test2 { public static void main(String[] arg ...

  7. java核心技术-多线程之线程基础

    说起线程,无法免俗首先要弄清楚的三个概念就是:进程.线程.协程.OK,那什么是进程,什么是线程,哪协程又是啥东西.进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,进程是动态运行着的代 ...

  8. JAVA线程基础概念及使用

    一.线程和进程的区别 在操作系统中所有运行的任务通常对应一个进程,进程是系统进行资源分配和调度的一个独立单位.线程是进程的组成部分,一个进程最少包含一个线程.并发和并行的区别是,并发指的在同一时刻内, ...

  9. Qt 线程基础(QThread、QtConcurrent、QThreadPool等)

      使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使 ...

随机推荐

  1. kernel32.dll 这个系统模块

    详细解读:远程线程注入DLL到PC版微信 一.远程线程注入的原理 1.其基础是在 Windows 系统中,每个 .exe 文件在双击打开时都会加载 kernel32.dll 这个系统模块,该模块中有一 ...

  2. git 命令 查看历史提交 git log

    怎么理解git commit 命令 git commit 相当于 我们虚拟机快照操作,每次执行commit命令 相当于对本地仓库做一次快照,保存了当时仓库的状态, git commit -m 加上的& ...

  3. 快速排序的js实现

    该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. var ...

  4. 小菜鸟之HTML第三课

    jquery的引入 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. python中property属性的介绍及其应用

    Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 使用property修饰的实例方法被调用时,可以把它当做实例属性一样 property的 ...

  6. Codeforces 1238F. The Maximum Subtree

    传送门 考虑构造一些区间使得树尽可能的 "大" 发现这棵树最多就是一条链加上链上出去的其他边连接的点 构造的区间大概长这样(图比较丑请谅解..$qwq$,图中每一个 "└ ...

  7. Java函数式接口

    函数式接口定义且只定义了一个抽象方法.函数式接口的抽象方法的签名称为函数描述符.Java 8的java.util.function包中引入了几个新的函数式接口. 1.Predicate java.ut ...

  8. squoosh

    谷歌在线压缩图片

  9. windows server12 FTP 创建后常见问题

    一:用administrator 关闭防火墙可以访问,但是开启后不能访问 今天在windows server 2008 R2上安装了FTP,安装过程如下,然后添加内置防火墙设置,设置后发现本地可以访问 ...

  10. O061、Boot from Volume

    参考https://www.cnblogs.com/CloudMan6/p/5679384.html   Volume 除了可以用作Instance的数据盘,也可以作为启动盘(Bootable Vol ...