在Java中如何正确地终止一个线程

本文介绍了三种终止Java线程的方法:不推荐使用的Thread.stop(),通过设置终止标识符来停止线程,以及利用Thread.interrupt()配合InterruptedException或isInterrupted()实现线程的安全终止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.使用Thread.stop()?

   极力不推荐此方式,此函数不安全且已废弃,具体可参考Java API文档

2.设置终止标识,例如:

import static java.lang.System.out;
public class TestThread extends Thread
{
    private boolean terminationFlag;
    public void run()
    {
        for (int i = 0; i != 10000000; ++i)
        {
            if (terminationFlag)
                break;
            out.println(i + 1);
        }
    }
    public void terminate()
    {
        terminationFlag = true;
    }
}

3.使用Thread.interrupt()

   interrupt()函数本身并不能终止线程,需要做一些处理方可终止线程

   ①若线程任务中包含Object.wait()、Thread.sleep(long)等可能引发InterruptedException的函数,则在调用interrupt()后会抛出InterruptedException

import static java.lang.System.out;
import java.util.logging.Logger;
import java.util.logging.Level;
public class TestThread extends Thread
{
    private static final Logger LOGGER = Logger.getLogger("TestThread");
    public void run()
    {
        for (int i = 0; i != 10000000; ++i)
        {
            try
            {
                Thread.sleep(100);
                out.println(i + 1);
            }
            catch (InterruptedException ex)
            {
                LOGGER.log(Level.SEVERE, null, ex);
                break;  //执行break后退出循环,run()也将执行完毕
            }
        }
    }
}

②若线程任务中不包含可能引发InterruptedException的函数,则可将Thread.isInterrupted()的返回值作为终止标识

import static java.lang.System.out;
public class TestThread extends Thread
{
    public void run()
    {
        for (int i = 0; i != 10000000; ++i)
        {
            if (isInterrupted())
                break;
            out.println(i + 1);
        }
        out.println("TestThread.run() will be finished");
    }
}

 

转载于:https://www.cnblogs.com/buyishi/p/9159157.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值