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

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 并发基础(九) java线程的终止与中断

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

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

详细可参考:

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 &amp;&amp; !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

出处:

原文地址:https://sihai.blog.csdn.net/article/details/81194543

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 并发基础(九) java线程的终止与中断


 上一篇
并发基础(八) java线程的中断机制 并发基础(八) java线程的中断机制
1. 引言当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务。Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制
2021-04-04
下一篇 
bat等大公司常考java多线程面试题 bat等大公司常考java多线程面试题
1、说说进程,线程,协程之间的区别 简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程.进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高.线程是进程的
2021-04-04