:::warning 怎么中断线程? :::

    1. 结束一个线程的调用栈,适用于知道线程的运行内容,比如自定义线程。

      1. public class ServerThread extends Thread {
      2. //volatile修饰符用来保证其它线程读取的总是该变量的最新的值
      3. public volatile boolean exit = false;
      4. @Override
      5. public void run() {
      6. ServerSocket serverSocket = new ServerSocket(8080);
      7. while(!exit){
      8. serverSocket.accept(); //阻塞等待客户端消息
      9. ...
      10. }
      11. }
      12. public static void main(String[] args) {
      13. ServerThread t = new ServerThread();
      14. t.start();
      15. ...
      16. t.exit = true; //修改标志位,退出线程
      17. }
      18. }
    2. 调用stop方法,立即退出,非常不安全已被废弃。

      1. 调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,包括在 catch 或 finally 语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
      2. 调用 stop() 方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题。
    3. 调用interrupt方法,需要明确的一点的是:interrupt() 方法并不像在 for 循环语句中使用 break 语句那样干脆,马上就停止循环。调用 interrupt() 方法仅仅是在当前线程中打一个停止的标记,并不是真的停止线程。也就是说,线程中断并不会立即终止线程,而是通知目标线程,有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。这一点很重要,如果中断后,线程立即无条件退出,那么我们又会遇到 stop() 方法的老问题。 ```java public class InterruptThread1 extends Thread{

      public static void main(String[] args) {

      1. try {
      2. InterruptThread1 t = new InterruptThread1();
      3. t.start();
      4. Thread.sleep(200);
      5. t.interrupt();
      6. } catch (InterruptedException e) {
      7. e.printStackTrace();
      8. }

      }

      @Override public void run() {

      1. super.run();
      2. for(int i = 0; i <= 200000; i++) {
      3. System.out.println("i=" + i);
      4. }

      }

    } ```