【thread】开启关闭线程

2022-07-25 13:52:50 浏览数 (2)

之前碰到过这样一个需求,开启一个测试子线程,还要能手动的去关闭,下面是我的实现方法。

一、开启线程

通过接口开启线程,开启后将线程id放入到map中。

代码语言:javascript复制
    //  存放线程ids
    Map<String, Long> mapThreadIds = new HashMap<>();

开启

代码语言:javascript复制
    @ApiOperation("开")
    @PostMapping("/test1")
    public Result test1() {
        Thread thread = new Thread(new Runnable() {
            @SneakyThrows
            @Override
            public void run() {
                while (true) {
                    Thread.sleep(1000);
                    String now = DateUtil.now();
                    System.out.println(now);
                }
            }
        });
        long id = thread.getId();
        mapThreadIds.put("thread", id);
        thread.start();
        return Result.ok();
    }

二、关闭线程

通过线程id获取线程对象,然后调用stop方法关闭线程。

我这需求是强制关闭就行啦,不用考虑数据完整性问题。

代码语言:javascript复制
    @ApiOperation("关")
    @PostMapping("/test2")
    public Result test2() {
        Long air = mapThreadIds.get("thread");
        Thread thread = findThread(air);
        if (thread != null) {
            thread.stop();
        }
        return Result.ok();
    }

核心方法

通过线程id,获取线程对象

代码语言:javascript复制
    /**
     * 通过线程id获取对象
     * @param threadId
     * @return
     */
    public static Thread findThread(long threadId) {
        ThreadGroup group = Thread.currentThread().getThreadGroup();
        while (group != null) {
            Thread[] threads = new Thread[(int) (group.activeCount() * 1.2)];
            int count = group.enumerate(threads, true);
            for (int i = 0; i < count; i  ) {
                if (threadId == threads[i].getId()) {
                    return threads[i];
                }
            }
            group = group.getParent();
        }
        return null;
    }

总结

腾云先锋(TDP,Tencent Cloud Developer Pioneer)是腾讯云GTS官方组建并运营的技术开发者群体。这里有最专业的开发者&客户,能与产品人员亲密接触,专有的问题&需求反馈渠道,有一群志同道合的兄弟姐妹。来加入属于我们开发者的社群吧!

0 人点赞