现在的jdk已经弃用了,stop方法。那么我们怎么结束一个线程呢。
先写一个实现:
Thread t = new Thread(()->{
while(Thread.interrupted()) {
return;
}
});
t.start();
t.interrupt();
讲道理,按照这种方式,这个代码是能被中断的。线程结束嘛。
可是有个问题。如果我中间有个业务块。这个业务要执行1h。
而我需要它只能执行30m执行不完就kill掉这个线程。怎么做呢
用到前面的知识。贴个代码。
不多说贴代码。
package com.puqiuyu.thread.blog;
public class ThreadService {
private Thread threadService;
private boolean finished = false;
public void execute(Runnable task) {
threadService = new Thread(()->{
Thread runner= new Thread(task);
//业务线程设为守护线程。当用户线程死亡。该线程死亡
runner.start();
try {
runner.join();
//保证runner执行完成后,才执行threadservice
finished = true;
} catch (InterruptedException e) {
System.out.println("end ....");
}
});
threadService.start();
}
public void shutdown(long mills) {
long starttime = System.currentTimeMillis();
while(!finished) {
if(System.currentTimeMillis()-starttime >=mills) {
this.threadService.interrupt();
//执行超时,则中断这个join,让threadservice执行结束。deamon就挂掉
break ;
}
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
System.out.println("interrupt .....");
}
finished = false;
}
}
这个代码是看的汪文君老师的实现。
利用deamon线程的特殊型,将业务线程设为deamon线程。通过join保证,保证业务线程的先行执行完毕。通过interrupt中断主线程。结束主线程后,守护线程终结。很好的思路。不过有一点。deamon是在所有用户线程挂掉之后才会挂掉。所以,main里面跑跑就行了。