一个正常的线程中断:
从运行到真正的结束,应该有三个阶段:
正常运行.
处理结束前的工作,也就是准备结束.
结束退出.
Java曾经提供过抢占式限制中断,但问题多多,例如的Thread.stop。另一方面,出于Java应用代码的健壮性的考虑,降低了编程门槛,减少不清楚底层机制的程序员无意破坏系统的概率,这个问题很多,比如:
当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,并抛出特殊的ThreadDeath()异常。这里的“立即”因为太“立即”了,
一个线程正在执行:
synchronized void { x = 3; y = 4;}
由于方法是同步的,多个线程访问时总能保证x,y被同时赋值,而如果一个线程正在执行到x = 3;时,被调用了 stop()方法,即使在同步块中,它也干脆地stop了,这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记 线程的stop方法,以后我们再也不要说“停止线程”了。
如何才能“结束”一个线程?
如今,Java的线程调度不提供抢占式中断,而采用协作式的中断。其实,协作式的中断,原理很简单,就是轮询某个表示中断的标记,我们在任何普通代码的中都可以实现。 例如下面的代码:
volatile bool isInterrupted;
//…
while(!isInterrupted) {
compute();
}
interrupt就是这样的一个通知,将Thead里的中断标志位设为true,而线程能否退出,就看用户的代码对于这个通知是怎么处理的了。
对于处于sleep,join等操作的线程,如果被调用interrupt()后,会抛出InterruptedException,然后线程的中断标志位会由true重置为false,因为线程为了处理异常已经重新处于就绪状态。
我在运行thinking in java里中断的例子时,一直都很奇怪为什么在catch(InterruptedException e)的处理段里,thead.isInterrupted()返回的都是false,原来是已被重置,所以很多导致无法中断线程,原因是出在这里。例如这段代码:
public class ThreadA extends Thread{
int count=0;
public void run(){
System.out.println(getName()+"将要运行...");
while(!this.isInterrupted()){
System.out.println(getName()+"运行中"+count++);
try{
Thread.sleep(400);
}catch(InterruptedException e){
System.out.println(getName()+"从阻塞中退出...");
System.out.println("this.isInterrupted()="+this.isInterrupted());
}
}
System.out.println(getName()+"已经终止!");
}
}
public class ThreadDemo{
public static void main(String argv[])throws InterruptedException{
ThreadA ta=new ThreadA();
ta.setName("ThreadA");
ta.start();
Thread.sleep(2000);
System.out.println(ta.getName()+"正在被中断...");
ta.interrupt();
System.out.println("ta.isInterrupted()="+ta.isInterrupted());
}
}
这段代码ThreadA线程永远都无法中断。
实际上,JVM内部确实为每个线程维护了一个中断标记。但应用程序不能直接访问这个中断变量,必须通过下面几个方法进行操作:
public class Thread {
//设置中断标记
public void interrupt() { ... }
//获取中断标记的值
public boolean isInterrupted() { ... }
//清除中断标记,并返回上一次中断标记的值
public static boolean interrupted() { ... }
...
}
如何使用中断标记来结束你的程序就是你自己来考虑的事了,事实上JVM只为我们设计一个中断标记而已。
分享到:
相关推荐
挂起线程通常通过调用`sleep()`或`wait()`方法实现,恢复线程可能通过`notify()`或`notifyAll()`唤醒,终止线程则可以通过`interrupt()`方法发送中断请求,但线程本身需要检查`isInterrupted()`或`...
Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...
`sleep()`方法让线程进入堵塞状态,`join()`方法等待线程执行完成,`yield()`方法让当前线程让出CPU,`stop()`方法停止线程(不推荐使用,因为可能引起数据不一致),`interrupt()`方法中断线程,以及`wait()`和`...
Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...
9. **线程中断**:通过`interrupt()`方法设置线程的中断标志,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求。 10. **线程Local变量**:`ThreadLocal`类为每个线程提供独立的变量副本,...
9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...
- `interrupt()`: 标记线程为中断状态,线程在检查到中断标志时可以决定如何响应。 - `synchronized`: 关键字用于同步访问共享资源,防止数据不一致性。 了解并熟练掌握这些线程操作是编写高效并发程序的基础。在...
Java提供了一些方法来控制线程状态,如`sleep()`使线程暂停执行一段时间,`join()`等待指定线程结束,`yield()`让当前线程暂停,让其他相同优先级的线程有机会执行,`interrupt()`用于中断线程。 同步是Java线程...
Java提供了一个interrupt()方法来标记线程中断,线程通过检查isInterrupted()或抛出InterruptedException来响应中断。 死锁是线程编程中常见的问题,当两个或更多线程互相等待对方释放资源而陷入僵局时就发生了死锁...
七、线程中断与异常处理 12. 中断机制:线程可以通过isInterrupted()和interrupt()方法来判断和设置中断状态。线程在执行过程中可以响应中断,通常通过检查中断状态并在适当位置抛出InterruptedException。 13. 异常...
Java的Thread类提供了start()来启动线程,interrupt()来中断线程,但需要注意的是,中断并不一定能立即停止线程,线程需要自行检查并响应中断状态。 另外,可能还会涉及到死锁、活锁和饥饿等并发问题,这些都是多...
Java线程阻塞中断是Java并发编程中的一个重要概念,它涉及到线程的生命周期管理以及协作。`Thread.interrupt()` 方法是用于向线程发送中断请求,而`LockSupport` 是Java 5引入的一个低级别的线程同步工具,提供了比`...
- **interrupt()**:中断线程,标记线程的中断状态,对于阻塞操作(如sleep、wait)会抛出`InterruptedException`。 4. **线程同步** - **synchronized**:关键字用于保证同一时间只有一个线程可以访问特定的代码...
七、线程中断 Java提供了interrupt()方法来中断线程,但被中断的线程并不会立即停止,而是会在检查到中断标志时抛出InterruptedException,通常在循环中检查isInterrupted()来响应中断请求。 通过学习以上知识点,...
Java线程是多任务编程的重要概念,特别是在...以上内容涵盖了Java线程的基本概念、创建方式、生命周期、同步机制、线程池、中断与通信以及线程安全的集合等关键知识点。理解和掌握这些内容对于进行多线程编程至关重要。
最后,"10_一天学会线程_线程中断.mp4"可能深入介绍了`interrupt()`和`isInterrupted()`方法的使用,以及如何处理中断异常`InterruptedException`。线程中断是一种协作机制,当一个线程被中断时,其他线程可以通过...
Java线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提高了程序的并发性和效率。在Java中,线程是程序执行的最小单位,由Java虚拟机(JVM)来管理和调度。理解并熟练掌握Java线程的创建、控制以及...
1. 线程中断:通过interrupt()方法设置中断标志,线程在检查到中断标志后,可以选择结束或采取其他措施。 2. 异常处理:线程中的异常如果不被捕获,会向上冒泡,可能导致整个线程停止。 通过深入学习和实践Java线程...
Java线程编程是Java开发中的重要组成部分,尤其在构建高性能、高并发的应用程序时不可或缺。本资料"JAVA-JavaThreadProgramming-Sams.zip"提供了一套详细的教程,旨在深入讲解Java中的多线程设计和实现。 Java多...
interrupt()用于中断线程,配合isInterrupted()或interrupted()检查线程是否被中断。 4. 同步与锁机制 在多线程环境中,数据安全和一致性问题至关重要。Java提供了synchronized关键字来实现线程同步,确保同一时间...