美文网首页
Java中断线程

Java中断线程

作者: liunewshine | 来源:发表于2019-09-29 17:18 被阅读0次

Java并没有提供真正中断线程的方法,<font color=red>中断线程最好的方法就是让线程执行完成自然终止</font>,stop(),suspend(),resume()等方法会导致不安全或者死锁等问题,均已经废弃。

有两种方法中断线程,一种为通过自定义变量设置退出标志,一种通过interrupt方法,本质没有区别。<font color=red>但是第二种方式可以处理阻塞中的线程,推荐使用。</font>

第一种:通过自定义变量设置退出标志,让线程自然终止

public class ThreadFlag extends Thread {
    public boolean exit = false;

    public void run() {
        while (!exit) {
            System.out.println("我是子线程,我在执行");
        }
    }

    public static void main(String[] args) throws Exception {
        ThreadFlag thread = new ThreadFlag();
        thread.start();
        sleep(5000); // 主线程延迟5秒,看效果
        thread.exit = true;  // 终止线程thread 
        thread.join();
        System.out.println("线程退出!");
    }
}

这种开关的方式使用大部分情况,但是当遇到线程阻塞时,就没有办法了会一直卡在那,如下面的示例代码。

public class ThreadFlag extends Thread {
    public boolean exit = false;

    public void run() {
        while (!exit) {
            try {
                sleep(1000_000);//
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("我是子线程,我在执行");
        }
    }

    public static void main(String[] args) throws Exception {
        ThreadFlag thread = new ThreadFlag();
        thread.start();
        sleep(5000); // 主线程延迟5秒,看效果
        thread.exit = true;  // 终止线程thread
        thread.join();
        System.out.println("线程退出!");
    }
}

第二种:使用线程的interrupt方法

这种方法不会真正停止线程,需要自己根据interrupted标志自行处理让线程自然结束,相比于第一种方式有一个好处就是可以处理阻塞中的线程,它可以迅速中断被阻塞的线程,抛出一个InterruptedException,把线程从阻塞状态中释放出来,第一种则不行。

public class ThreadInterrupt extends Thread {

    public void run() {
        while (!isInterrupted()) {//判断结束标志
            try {
                sleep(1000_000);//
            } catch (InterruptedException e) {
                e.printStackTrace();
                return;
            }
            System.out.println("我是子线程,我在执行");
        }
    }

    public static void main(String[] args) throws Exception {
        ThreadInterrupt thread = new ThreadInterrupt();
        thread.start();
        sleep(5000); // 主线程延迟5秒,看效果
        thread.interrupt();
        thread.join();
        System.out.println("线程退出!");
    }
}

相关文章

  • Java线程中断

    本文主要介绍Java线程中断一些相关的概念以及注意点 Java线程的中断并不是强制的中断,调用线程中断的方法时只是...

  • 线程中断

    什么是线程中断?线程中断即线程运行过程中被其他线程打断了。 线程中断的重要方法2.1 java.lang.Thre...

  • JAVA并发编程(三)线程协作与共享

    1. 线程中断 java线程中断是协作式,而非抢占式 1.1. 线程中断相关方法 interrupt()将线程的中...

  • 【多线程】——3.线程的中断

    线程中断的概念 java线程中断是一种协作机制 通过中断并不能直接终止线程的运行 需要被中断的线程自己处理中断 (...

  • (4)线程中断

    什么是线程中断 java中的线程中断并不是指强制线程中断执行,而是指调用线程中断起到一个通知作用,让线程知道自己被...

  • 线程中断

    Java的中断是一种协作机制,线程中断不会终止线程的运行,但是可以通过线程中断来实现终止线程运行。 线程在不同状态...

  • Java “优雅”地中断线程(原理篇)

    前言 线程中断系列文章: Java “优雅”地中断线程(实践篇)[https://www.jianshu.com/...

  • Java线程中断

    首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thr...

  • Java 线程中断

    1. 中断线程 public void interrupt()停止一个线程,但不会终止一个正在运行的,还需要加入一...

  • Java线程简介

    本文将介绍Java线程的状态、线程的中断、线程间通信和线程的实现。 线程的状态 Java语言定义了6种不同的线程状...

网友评论

      本文标题:Java中断线程

      本文链接:https://www.haomeiwen.com/subject/kjfqpctx.html