如何优雅地结束一个线程
结束一个线程最好的方式,是让其执行完业务逻辑之后,自动地结束。但是有时候可能无法达到这种理想的状态,比如一个正在上传大文件的线程,当我们要取消这个操作的时候,就需要手动地结束这个线程。保证线程执行的中间状态不丢失以及保证数据的一致性是结束一个线程的时候需要关注的问题。
volatile结束线程
public class TestThread {
private static volatile boolean running = true;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
long i = 0L;
while (running) {
i++;
}
System.out.println("t1 end, i = " + i);
});
t1.start();
Thread.sleep(1000);
running = false;
}
}
一个线程可以通过监控一个volatile变量来结束线程,当监控到volatile改变的时候,可以做一些保存中间状态的操作等善后工作。
interrupt结束线程
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
long i = 0L;
while (!Thread.interrupted()) {
i++;
}
System.out.println("t1 end, i = " + i);
});
t1.start();
Thread.sleep(1000);
t1.interrupt();
}
通过interrupt()方法也可以达到类似于volatile的效果。不同之处在于interrupt方法修改的是线程本身的一个标志位,而volatile修改的是一个共享变量。