【多线程】 您所在的位置:网站首页 线程停止的方法有哪些stop 【多线程】

【多线程】

#【多线程】| 来源: 网络整理| 查看: 265

    最近在系统回顾多线程这一部分的内容,对线程中断方式这一部分相比之前有了不同的认识。整理一下,如有理解偏颇之处,还请各位大神不惜赐教。

    在看高洪岩《Java多线程编程核心技术》的时候里面讲了很多种停止线程方式,其实仔细回想起来停止线程并没有那么复杂。总体整理下来就三种方式!1、正常退出;2、stop暴力停止(不再推荐使用);3、异常法;

1、正常退出

当线程中run()或者call()按照逻辑流程正常的执行结束了,线程也就自然停止了。

2、stop暴力停止

直接在程序中使用thread.stop(),线程会马上停止,但是可能导致数据不同步,或者资源得不到回收的问题而且stop已经标注为作废方法,所以使用一定要慎重。

3、interrupt()异常法。

   小编以前的博客写过《【多线程】——停止线程的三种方式》其中讲的是interrupt()和在沉睡中停止本质上讲这两种方式都是通过异常停止的,而且讲的不是很全面,应该是只要线程处于阻塞状态配合interrupt()都能使线程停止,而且停止的方式都是通过抛异常。

    interrupt()方法仅仅是在当前线程中打了一个停止的标识将中断标志修改为true,并没有真正的停止线程。如果在此基础上进入堵塞状态(sleep(),wait(),join()),马上就会抛出一个InterruptedException,且中断标志被清除,重新设置为false,线程退出。所以退出线程的方式不仅仅是sleep()+interrupt()方法,其它的暂停线程的方式都可以。

package com.jia.thread; /** * @author 贾文静 on 2018/6/6. * Describe */ public class InterruptService implements Runnable { //如果使用Callable接口中call方法异常就会得以扩散 @Override public void run() { try { System.out.println( "begin run" ); //重要:无论是先中断还是先阻塞都能达到停止线程的目的,只要两者配置使用就可以到达效果 Thread.currentThread().interrupt(); //方式一,线程进入sleep // Thread.sleep( 10 ); //方式二、join // Thread.currentThread().join(); //方式三、wait // Thread.currentThread().wait(); System.out.println( "begin end" ); } catch (Exception e) { System.out.println("先interrupt再阻塞后终止了"); e.printStackTrace(); } } } package com.jia.thread; /** * @author 贾文静 on 2018/6/6. * Describe */ public class SleepThread { public static void main(String[] args) throws InterruptedException { try { InterruptService interruptService = new InterruptService(); Thread thread = new Thread(interruptService); thread.start(); Thread.sleep(2000); } catch (Exception e) { e.printStackTrace(); } } } interrupt简述

    interrupt()方法只是改变中断状态,不会中断一个正在运行的线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程检查到中断标识,就得以退出阻塞的状态。 

    更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。

this.interrupted()

    测试当前线程是否已经中断(静态方法)。返回的是上一次的中断状态,并且会清除该状态,所以连续调用两次,第一次返回true,第二次返回false。

this.isInterrupted()

    测试线程当前是否已经中断,但是不能清除状态标识。

总结

    再次总结线程的停止方式,将线程停止方式归纳一下,就三种方式,理解清楚了其实也不是很复杂。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有