java中终止一个线程大至可以用以下三种方式
- 使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止。
- 使用 interrupt 方法中断线程。
- 使用 stop() 方法强行终止线程(调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,不推荐使用这个方法,该方法已被弃用)。
使用退出标志方式:
public class MyThread extends Thread {
public volatile boolean exit = false;
public void run() {
while (!exit) {
System.out.println("do something");
}
}
public static void main(String[] args) throws Exception {
MyThread thread = new MyThread();
thread.start();
sleep(5000);
thread.exit = true;
thread.join();
System.out.println("线程退出!");
}
}
使用interrupt:
package com.example.demo.controller;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("thread")
@Api("线程中断测试")
public class ThreadTest {
public static MyThread myThread=new MyThread();
@GetMapping("/start")
public void start(){
myThread.start();
}
@GetMapping("/stop")
public void stop(){
myThread.interrupt();
}
}
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100000000; i++) {
System.out.println("i=" + (i + 1));
if (this.isInterrupted()) {
System.out.println("通过this.isInterrupted()检测到中断");
System.out.println("第一个interrupted()" + this.interrupted());
System.out.println("第二个interrupted()" + this.interrupted());
break;
}
try {
Thread.sleep(1000);
}catch ( Exception ex){
this.interrupt();
}
}
System.out.println("因为检测到中断,所以跳出循环,线程到这里结束,因为后面没有内容了");
}
}
interrupt():仅仅是在当前线程中打了一个停止的标记,并不是真正的停止线程
interrupted():测试当前线程是否已经是中断状态,执行后具有清除中断状态flag的功能
isInterrupted(): 测试线程Thread对象是否已经是中断状态,但不清除中断状态flag