并发基础 java线程的终止与中断

Posted 潜龙在渊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发基础 java线程的终止与中断相关的知识,希望对你有一定的参考价值。

1、简单了解一下:为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?

??suspend 、resume、stop方法分别完成了线程的暂停、恢复、终止的工作。不建议使用原因:是因为这三个方法带来的副作用,如suspend( )方法,调用后,线程就会一直占用资源睡眠,直到调用resume( )恢复后,才可以运行。这样很容易引发死锁。同样,stop( )方法在终结一个线程时不会保证线程的资源正常释放,因此会导致程序可能工作在不确定的状态下。
??线程的暂停、恢复操作可以用 等待/通知 机制来替代。但线程的终止就要用户去实现了。
详细可参考:http://bjzhkuang.iteye.com/blog/1748396

2、如何优雅安全地终止线程

??终止一个线程 本质上就是线程间的通信交互的过程。因此,线程间的通信方式:共享变量、流、中断都可以用来实现终止线程的机制。最常用的方式便是“中断”;
下面的例子是:除了中断,还可利用boolean变量来控制是否需要终止线程;

public class ThreadTest{
public static void main(String[] args) throws InterruptedException {
    MyTask taskOne = new MyTask();
    Thread threadOne = new Thread(taskOne,"threadOne");
    threadOne.start();
    TimeUnit.MILLISECONDS.sleep(500);
    threadOne.interrupt();
    
    MyTask taskTwo = new MyTask();
    Thread threadTwo = new Thread(taskTwo,"threadTwo");
    threadTwo.start();
    TimeUnit.MILLISECONDS.sleep(500);
    taskTwo.cancel();
}

private static class MyTask implements Runnable{

    //要加上volatile 修饰符,保证内存的可见性,及时更新变量值
    private volatile boolean on = true; 
    private long i;
    
    @Override
    public void run() {
        //调用cancel、或者中断都可以终止线程
        while(on && !Thread.currentThread().isInterrupted()){
            i++;
        }
        System.out.println("线程"+Thread.currentThread().getName()+" Count i = "+i);
    }
    
    public void cancel(){
        on = false;
    }   
}
}

运行结果:

线程threadOne Count i = 239418320
线程threadTwo Count i = 235374425





以上是关于并发基础 java线程的终止与中断的主要内容,如果未能解决你的问题,请参考以下文章

Java高并发-多线程基础

第七章:取消与关闭——Java并发编程实战

java并发编程实战:第七章----取消与关闭

Java并发编程原理与实战四:线程如何中断

《Java并发编程实战》---- 取消与关闭

Java开发面试技能介绍,mysqlnavicat还原数据