欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java 两阶段终止线程的正确做法

程序员文章站 2022-03-25 08:40:21
目录一、怎么优雅地关闭一个线程?1.错误做法2.正确做法二、要点一、怎么优雅地关闭一个线程?在一个线程t1中如何优雅地关闭线程t2(也就是说要给t2一个机会释放持有的资源)?1.错误做法使用s...

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

在一个线程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 两阶段终止线程内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: java 终止线程