- 利用变量标识, 结束循环 (循环条件返回
false
, 结束正在执行循环的线程) - 利用
interrupt()
和 isInterrupt()
- 对于
sleep()
wait()
join()
的线程, 利用 interrupt()
让线程抛出 InterruptedException
, 在 catch
块中处理
变量标识
volatile boolean loop = true;
@Test
public void testWhileCondition() {
Thread t = new Thread(() -> {
while (loop) {
System.out.println("线程执行中...");
}
System.out.println("线程执行结束...");
});
t.start();
ThreadUtils.sleepQuietly(1);
loop = false;
ThreadUtils.sleepQuietly(2);
}
利用 interrupt()
isInterrupted()
@Test
public void testInterrupted() {
Thread t = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("线程没有被打断...");
}
System.out.println("线程被打断了...");
});
t.start();
ThreadUtils.sleepQuietly(1);
t.interrupt();
ThreadUtils.sleepQuietly(5);
}
利用 interrupt() InterruptedException
@Test
public void testInterrupt() {
Thread t = new Thread(() -> {
try {
System.out.println("开始 Thread.currentThread().isInterrupted() = " + Thread.currentThread().isInterrupted());
System.out.println("开始睡眠 1s...");
Thread.sleep(2000);
System.out.println("睡眠结束...");
} catch (Exception e) {
log.error(e.getMessage(), e);
}
});
t.start();
ThreadUtils.sleepQuietly(1);
t.interrupt();
System.out.println("主线程 Thread.currentThread().isInterrupted() = " + t.isInterrupted());
ThreadUtils.sleepQuietly(5);
}