之前碰到过这样一个需求,开启一个测试子线程,还要能手动的去关闭,下面是我的实现方法。
一、开启线程
通过接口开启线程,开启后将线程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官方组建并运营的技术开发者群体。这里有最专业的开发者&客户,能与产品人员亲密接触,专有的问题&需求反馈渠道,有一群志同道合的兄弟姐妹。来加入属于我们开发者的社群吧!