zoukankan      html  css  js  c++  java
  • 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秒才退出么,下面试验下:

    编译运行:

    当然不会啦~~所以完美的解决了我们的需求~~这个在实际项目中应该还是有这种类似的需求的~~

  • 相关阅读:
    Sqlserver 2008:sp_msforeachdb 坑爹的错误陷阱
    安装官方 Synaptics 驱动,终于解决 HP Pavilion G4 笔记本 讨厌的触摸板锁定问题!
    Sqlserver 2008+:变更数据捕获(CDC) 和 更改跟踪(CT)
    PHP.ini 性能优化
    PHP Notice: Undefined index: ... 问题的解决方案
    查询类方法代码分析
    页面跳转方法总结大全
    如何关闭searchIndexer.exe进程
    如何正确运用PHP ini_set函数
    PHP中的串行化变量和序列化对象
  • 原文地址:https://www.cnblogs.com/webor2006/p/8012800.html
Copyright © 2011-2022 走看看