`
oscar999
  • 浏览: 216759 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

正确中断java线程

 
阅读更多
不提倡的stop()方法
臭名昭著的stop()停止线程的方法已不提倡使用了,原因是什么呢?
 当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,并抛出特殊的ThreadDeath()异常。这里的“立即”因为太“立即”了,
假如一个线程正在执行:
synchronized void {
x = 3;
y = 4;
}

  由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到x = 3;时,被调用了 stop()方法,即使在同步块中,它也干脆地stop了,这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记 线程的stop方法,以后我们再也不要说“停止线程”了。

  如何才能“结束”一个线程?

interupt()中断线程

一个线程从运行到真正的结束,应该有三个阶段:
  1. 正常运行.
  2. 处理结束前的工作,也就是准备结束.
  3. 结束退出.
那么如何让一个线程结束呢?既然不能调用stop,可用的只的interrupt()方法。但interrupt()方法只是改变了线程的运行状态,如何让它退出运行?对于一般逻辑,只要线程状态已经中断,我们就可以让它退出,这里我们定义一个线程类ThreadA,所以这样的语句可以保证线程在中断后就能结束运行:
 while(!isInterrupted()){
正常逻辑
}

,一个测试类,ThreadDemo
  这样ThreadDemo调用interrupt()方法,isInterrupted()为true,就会退出运行。但是如果线程正在执行wait,sleep,join方法,你调用interrupt()方法,这个逻辑就不完全了。
我们可以这样处理:
 public void run(){

while(!isInterrupted()){
try{
正常工作
}catch(InterruptedException e){
//nothing
}

}
}
}
想一想,如果一个正在sleep的线程,在调用interrupt后,会如何?wait方法检查到isInterrupted()为true,抛出异常, 而你又没有处理。而一个抛出了InterruptedException的线程的状态马上就会被置为非中断状态,如果catch语句没有处理异常,则下一 次循环中isInterrupted()为false,线程会继续执行,可能你N次抛出异常,也无法让线程停止。
这个错误情况的实例代码
ThreadA

publicclassThreadAextendsThread...{
intcount=0;
publicvoidrun()...{
System.out.println(getName()
+"将要运行...");
while(!this.isInterrupted())...{
System.out.println(getName()
+"运行中"+count++);
try...{
Thread.sleep(
400);
}
catch(InterruptedExceptione)...{
System.out.println(getName()
+"从阻塞中退出...");
System.out.println(
"this.isInterrupted()="+this.isInterrupted());

}

}

System.out.println(getName()
+"已经终止!");
}

}

ThreadDemo
publicclassThreadDemo...{

publicstaticvoidmain(Stringargv[])throwsInterruptedException...{
ThreadAta
=newThreadA();
ta.setName(
"ThreadA");
ta.start();
Thread.sleep(
2000);
System.out.println(ta.getName()
+"正在被中断...");
ta.interrupt();
System.out.println(
"ta.isInterrupted()="+ta.isInterrupted());
}


}


 那么如何能确保线程真正停止?在线程同步的时候我们有一个叫“二次惰性检测”(double check),能在提高效率的基础上又确保线程真正中同步控制中。那么我把线程正确退出的方法称为“双重安全退出”,即不以isInterrupted ()为循环条件。而以一个标记作为循环条件:
正确的ThreadA代码是:


publicclassThreadAextendsThread...{
privatebooleanisInterrupted=false;
intcount=0;

publicvoidinterrupt()...{
isInterrupted
=true;
super.interrupt();
}


publicvoidrun()...{
System.out.println(getName()
+"将要运行...");
while(!isInterrupted)...{
System.out.println(getName()
+"运行中"+count++);
try...{
Thread.sleep(
400);
}
catch(InterruptedExceptione)...{
System.out.println(getName()
+"从阻塞中退出...");
System.out.println(
"this.isInterrupted()="+this.isInterrupted());

}

}

System.out.println(getName()
+"已经终止!");
}

}




分享到:
评论

相关推荐

    Java线程详解大全

    Java线程是并发编程的核心部分,它允许程序在同一时间执行多个独立的任务,从而提高系统效率和响应速度。本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要...

    Java线程使用教程

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。本教程将深入探讨Java线程的使用,帮助开发者掌握这一关键技术。 一、线程基础 1. **线程的概念**:线程...

    JAVA线程学习(源代码)

    本资源"JAVA线程学习(源代码)"提供了关于Java线程的源代码示例,帮助我们深入理解和实践线程的使用。 首先,我们要理解Java中的线程模型。Java线程由`java.lang.Thread`类或`java.util.concurrent.Executor`框架来...

    java线程.rar

    Java线程是Java编程语言中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,线程是通过类`Thread`或实现`Runnable`接口来创建和管理的。Java线程模型是基于操作系统的原生...

    java线程实战手册

    6. **线程中断与停止**:正确地停止线程是一项挑战,Java提供了interrupt()方法来请求线程中断,但需要注意的是,这并不一定能立即停止线程,需要配合中断标志进行检查和处理。 7. **线程池**:Executor框架和...

    java中断线程的正确姿势完整示例.rar

    以下是一个简单的示例,展示了如何正确中断线程: ```java public class InterruptedThreadExample implements Runnable { private volatile boolean running = true; @Override public void run() { try { ...

    Java线程超时监控

    在Java编程中,多线程是并发执行任务的重要方式,然而在实际应用中,我们可能会遇到某些线程执行时间过长或死锁的情况,这可能导致系统资源的浪费甚至整体性能下降。因此,对线程进行超时监控是必要的,以确保程序的...

    Java线程基础教程完整版

    Java线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应性。在Java中,线程是程序执行的最小单位,由Java虚拟机(JVM)管理。本教程将深入讲解Java线程的基础知识,帮助你掌握多...

    JAVA线程(第三版)

    《JAVA线程(第三版)》是一本深入探讨Java多线程编程的权威书籍,针对Java线程的管理和优化提供了详尽的解析。线程在现代计算机编程中扮演着至关重要的角色,尤其是在并发处理和高性能应用中。Java以其强大的线程...

    JAVA多线程编程技术PDF

    在Java编程领域,多线程是一项至关重要的技术,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点...

    java线程 线程学习资料 java线程教程

    ### Java线程教程知识点梳理 #### 一、教程概述 - **目标读者**: 本教程主要面向具备丰富Java基础知识但缺乏多线程编程经验的学习者。 - **学习成果**: 学习者能够掌握编写简单的多线程程序的能力,并能够理解和...

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    Java提供了一个更安全的中断线程的机制,即`Thread.interrupt()`。当调用`interrupt()`时,目标线程的中断状态会被设置,线程在检查到中断状态后可以决定如何响应。例如,`Thread.sleep()`、`SocketInputStream....

    Java线程赛马优先级示例.rar

    Java线程赛马优先级示例是一个典型的多线程编程问题,它涉及到Java中的线程管理、优先级机制以及并发执行的概念。在这个示例中,我们有两个线程,一个被标记为高优先级,另一个为低优先级,它们在程序运行时会进行...

    Java线程中断示例程序的代码清单.pdf

    Java线程中断是一个关键特性,它允许程序员在运行时通知一个线程停止其当前的工作并进行清理。在上述的Java线程中断示例程序中,我们看到一个简单的场景,模拟了一个班级中的学生(student线程)和教师(teacher线程...

    java线程详细资料

    Java线程是Java编程中的重要概念,它允许程序并发执行多个任务,从而提高了系统的效率和响应性。在Java中,线程是程序执行的最小单位,由Java虚拟机(JVM)来管理和调度。理解并熟练掌握Java线程对于开发高效、可...

    JAVA100例之实例66 实现对线程的控制,中断、挂起、恢复、停止

    线程控制是Java多线程编程中的重要概念,包括中断、挂起、恢复和停止。本实例将深入探讨这些主题,帮助你更好地理解和掌握Java中线程的高级操作。 1. **线程中断**: Java通过`Thread.interrupt()`方法提供线程...

    Java多线程编程

    9. **并发容器**:Java并发包提供了线程安全的容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,它们在多线程环境下保证了数据的一致性和正确性,减少了同步的开销。 10. **线程优先级**:Java中的线程有...

    Java多线程笔记

    Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,可以使用 ...

    java多线程详解(比较详细的阐述了多线程机制)

    Java多线程还涉及到线程中断和异常处理,Thread类提供了interrupt()方法发起中断请求,线程可以通过检查isInterrupted()或isInterrupted()状态响应中断。在多线程环境中,异常处理也需特别注意,合理的try-catch-...

    介绍 Java 多线程 的PPT

    线程可以通过`sleep()`方法暂停执行,通过`join()`方法等待其他线程结束,通过`interrupt()`方法中断线程,以及`isAlive()`方法检查线程是否仍在运行。 在实际开发中,理解并掌握这些概念和方法是至关重要的,可以...

Global site tag (gtag.js) - Google Analytics