美文网首页
Java怎样结束一个线程

Java怎样结束一个线程

作者: 业精于勤_荒于嬉 | 来源:发表于2023-07-31 05:26 被阅读0次

在Java中可以使用以下方法来结束一个线程:

java.lang.Thread类中包含了一些常用的方法,如:start(),stop(),stop(Throwable),suspend(),destory(),resume()。通过这些方法,我们可以对线程进行方便的操作,但是这些方法中,只有start()方法得到了保留。
在JDK帮助文档以及Sun公司的一篇文章《Why are Thread stop,Thread suspend and Thread resume Deprecated?》中都讲解了舍弃这些方法的原因。

简单来说是因为:使用stop方法虽然可以 强行终止 正在运行或挂起的线程,但使用stop方法是很危险的,就像突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,因此,并不推荐使用stop方法来终止线程。

一、使用标志位

当run方法执行完后,线程就会退出。但是有时run方法是永远不会结束的,如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。

在线程的执行逻辑中,设置一个标志位来判断是否需要终止线程,将标志位设置为true,当外部需要终止线程时,将标志位设置为false,将线程在下一次循环中检查该标志位并主动退出循环从而结束线程。

public class MyThread extends Thread {
    private volatile boolean isRunning = true;

    public void run() {
        while (isRunning) {
            // 线程执行的逻辑
        }
    }

    public void stopThread() {
        isRunning = false;
    }
}

二、使用interrupt()方法+InterruptedException

如果一个线程由于等待某些事件的发生而被阻塞,又该怎样停止该线程呢?
这种情况经常会发生,比如当一个线程由于需要等候键盘输入而被阻塞,或者调用Thread.join()方法,或者Thread.sleep()方法,在网络中调用ServerSocket.accept()方法,或者调用了DatagramSocket.receive()方法时,都有可能导致线程阻塞,使线程处于不可运行状态时,即使主线程中将该线程的共享变量设置为true,但该线程此时根本无法检查循环标志,当然也就无法立即中断。

这时建议不要使用stop()方法,而是使用Thread提供的interrupt()方法,因为该方法虽然不会中断一个正在运行的线程,但是它可以 使一个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出阻塞代码

调用Thread类的interrupt()方法可以发送中断信号给目标线程。在线程的执行逻辑中通过检查isInterrupted()方法或捕获InterruptException异常来响应中断信号并退出循环从而结束线程。

线程处于阻塞状态,如Thread.sleep、wait、IO阻塞等情况时,调用interrupt方法后,sleep等方法将会抛出一个InterruptedException

public class MyThread extends Thread {

    public void run() {
        while (!isInterrupted()) {
            // 线程执行的逻辑

            try {
                sleep(1000);
            } catch (InterruptedException e) {  // 捕获 InterruptedException 异常
                break;  // 响应中断信号并退出循环
            }
        }
    }
}

// 终止线程:
myThread.interrupt();

请注意,在上述两种方式中,第一种方式是通过自定义变量控制和终止线程序列;第二种方式是通过Java提供的interrupt机制向线程发送中断信号,然后在线程内部进行响应。选择合适的方式取决于具体需求和场景。

相关文章

  • 2018-11-11

    如何新建一个线程? 线程状态是怎样转换的? 关于线程状态的操作是怎样的? 1. 新建线程 一个java程序从mai...

  • java 结束线程

    前言 一般线程执行完 run 方法后,线程就正常结束了。但有时候 run 方法永远不会结束。因此,此时需要特殊处理...

  • java和android子线程中抛出异常的研究

    Java语言 java语言里, 子线程中抛出的RuntimeException, 只会使得子线程结束运行, 不会...

  • 并发类面试题

    1.java线程中的守护线程和用户线程概述 只要当JVM实例中尚存任何一个非守护线程没有结束,守护线程...

  • Java 并发之线程中断

    一、前言 所谓线程中断,其实就是终止一个线程。在使用 Java 线程时,除了线程自行正常结束,很多时候也需要提前结...

  • java中如何结束线程

    java中如何结束线程 我们可以使用interrupt()方法来结束线程 此方法分为两种情况: (1)线程处于阻塞...

  • 线程的生命周期,状态是如何转移的

    在Java语言中,一个线程从其创建、启动到其运行结束的整个生命周期可能经历若干状态,如图所示。 Java线程的状态...

  • 2021-01-22 主线程与守护线程

    默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运...

  • Java 内存模式 HB法则

    Java内存模型 HB法则 概述 HB 7法则:volatile、start线程开始、join线程结束、lock锁...

  • 带你搞懂Java多线程(三)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二) 什么是线程间的共享 Java支持多个线程同时访问一个对象...

网友评论

      本文标题:Java怎样结束一个线程

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