java两阶段终止线程怎么实现

发布时间:2021-12-13 09:04:31 作者:iii
来源:亿速云 阅读:132

这篇文章主要讲解了“java两阶段终止线程怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java两阶段终止线程怎么实现”吧!

一、怎么优雅地关闭一个线程?

在一个线程T1中如何优雅地关闭线程T2(也就是说要给T2一个机会释放持有的资源)?

1.错误做法

使用stop()方法停止线程:

stop()方法会真正杀死线程,如果此时该线程持有锁,那么其他线程将永远无法获取锁。

使用System.exit()方法停止线程:

会让整个进程都退出

2.正确做法

思路:

java两阶段终止线程怎么实现

代码实现:

public class Test {
    public static void main(String[] args) throws InterruptedException {
        TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination();
        twoPhaseTermination.start();

        Thread.sleep(3000);
        twoPhaseTermination.stop();

    }
}

class TwoPhaseTermination{
    // 监控线程
    private Thread monitorThread;

    public void start(){
        monitorThread = new Thread(()->{
            Thread current = Thread.currentThread();
            while(true){
                if(current.isInterrupted()){

                    System.out.println("线程要关闭了...");
                    break;
                }
                try {
                    Thread.sleep(1000); // 阶段1
                    System.out.println("监控线程正在工作...."); // 阶段2
                     // 如果在阶段2被打断,线程的isInterrupted标志位为true,会捕抓到信号并关闭线程
                     // 如果在阶段1被打断,会进入catch语句块,并且isInterrupted标志位清空,无法关闭线程
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    // 需要重新设置isInterrupted标志位为true
                    monitorThread.interrupt();
                }
            }

        });
        // 启动线程
        monitorThread.start();
    }

    public void stop(){
        // 设置isInterrupted标志位true
        monitorThread.interrupt();
    }
}

运行结果:

两阶段关闭线程:

java两阶段终止线程怎么实现

二、要点

为什么需要在catch代码块中重新执行monitorThread.interrupt()?因为Thread.sleep()执行过程中被打断,isInterrupted标志位会清空,下一次进入while循环就会忽略这次打断,继续运行线程。

演示一下把monitorThread.interrupt()注释掉的结果:

java两阶段终止线程怎么实现

可以看到,会忽略这次的isInterrupted信号,继续运行线程。

感谢各位的阅读,以上就是“java两阶段终止线程怎么实现”的内容了,经过本文的学习后,相信大家对java两阶段终止线程怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. java 多线程-线程的终止
  2. java中断和终止线程的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:C语言怎么求两个正整数的最大公约数

下一篇:Go并发编程中sync/errGroup怎么使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》