“杀死”Java线程的一些方法
来源:互联网 发布:mac windows分区减小 编辑:程序博客网 时间:2024/05/16 14:18
这些天在琢磨线程的问题,发现在java中要实现“杀死”线程的问题,是一个比较棘手的问题。在java的老版本中提供了stop()方法来实现杀死线程,但是stop方法是不安全的,它暴力的终端线程的执行,会使JVM的内存机制受到挑战,具体原因我也不是很理解,请参考以下Oracel的解释,链接如下:英文原址
其实在上面的链接中已经给出了一种替代stop()的方法,会在以下介绍到。我们杀死线程的中心思想只有一个那就是让线程自己走完它的流程。基于这种思想,我们有这么几种方式:
有一篇博客强烈推荐:interrupt理解
1. 设置全局变量标志
通过设置全局变量来控制线程,具体看代码
public static volatile boolean isRunning=true;@Overridepublic void run() { // TODO Auto-generated method stub int i=0; while (isRunning) { long time=System.currentTimeMillis(); while(System.currentTimeMillis()-time<1000){ } i++; System.out.println("时间过去了"+i+"s"+Thread.currentThread().toString()); } System.out.println("GlobalVeribelThrea end"+Thread.currentThread().toString()); super.run();}
通过isRunning变量来控制循环体,Test代码如下:
public static void main(String[] args) { GlobalVeribelThread globalVeribelThread=new GlobalVeribelThread(); globalVeribelThread.start(); GlobalVeribelThread globalVeribelThread2=new GlobalVeribelThread(); globalVeribelThread2.start(); try { globalVeribelThread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } GlobalVeribelThread.isRunning=false; try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } GlobalVeribelThread.isRunning=true;}
这种方式,控制线程,如果发生多线程同步问题,就需要对全局变量加锁操作,同步的精髓在于可见性,以及原子性,volatile关键字只保证了可见性,关于volatile关键字,ibm有篇文章很好Java volatile关键字
2. 通过interrupt()脱离线程阻塞状态,跳出程序体。
使用interrupt()方法之前得先明确线程的基本知识,线程的基本状态等基础知识,interrupt方法是将进入到阻塞状态的线程抛出一个中断异常并改变线程的阻塞状态,通过这一点我们可以在捕获中断异常中执行跳出循环体操作。具体见代码:
@Overridepublic void run() { int i=0; while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("thread1 interrupt exception" + e.toString()); break; } i++; System.out.println("thread1 is :"+i+" thread name:"+Thread.currentThread().getName()); } System.out.println("thread end"+Thread.currentThread().getName());}
测试代码如下:
public static void main(String[] args) { TestThread1 testThread1=new TestThread1(); testThread1.start(); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } testThread1.interrupt();}
结果是:
thread1 is :1 thread name:Thread-0thread1 is :2 thread name:Thread-0thread1 is :3 thread name:Thread-0thread1 interrupt exceptionjava.lang.InterruptedException: sleep interruptedthread endThread-0
达到了“杀死”线程的目的。
0 0
- “杀死”Java线程的一些方法
- 杀死子进程与子线程的方法
- Java中是怎么杀死线程的??(有待补充)
- 杀死进程的方法
- 杀死进程的方法
- 杀死Service的方法
- 【JAVA之多线程】8.一些线程方法
- java线程中断,interrupt()方法的一些示例
- Java中获取进程ID以及杀死进程的方法
- Java中获取进程ID以及杀死进程的方法
- Java中获取进程ID以及杀死进程的方法
- Java中获取进程ID以及杀死进程的方法
- 线程同步的一些方法
- java怎样杀死一个指定线程
- LINUX 杀死进程的方法
- Oracle 杀死session的方法
- oracle 杀死死锁的方法
- Linux杀死进程的方法
- 二进制十进制转换
- 【shell】1至100的累加和
- 支付清算体系介绍-上
- Junit
- C++ STL算法系列1---count函数
- “杀死”Java线程的一些方法
- fork函数简介
- php 生成加密公钥加密私钥
- 动画view中invalidate()和requestLayout()的生命周期
- Dom4j 解析 XML(Java Api)
- Unity 3D 读取android 本地相册打开相机
- 【shell】找到系统中最大的文件
- 基于二进制的权限判断
- oracle awr详解