`
kgdso
  • 浏览: 88561 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java 线程的中断(zt)

阅读更多

假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢?
Java代码
class ATask implements Runnable{  
 
    private double d = 0.0;  
      
    public void run() {  
        //死循环执行打印"I am running!" 和做消耗时间的浮点计算  
        while (true) {   假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢?

  
class ATask implements Runnable{

	private double d = 0.0;
	
	public void run() {
		//死循环执行打印"I am running!" 和做消耗时间的浮点计算
		while (true) {
			System.out.println("I am running!");
			
			for (int i = 0; i < 900000; i++) {
				d =  d + (Math.PI + Math.E) / d;
			}
			//给线程调度器可以切换到其它进程的信号
			Thread.yield();
		}
	}
}

public class InterruptTaskTest {
	
	public static void main(String[] args) throws Exception{
		//将任务交给一个线程执行
		Thread t = new Thread(new ATask());
		t.start();
		
		//运行一断时间中断线程
		Thread.sleep(100);
		System.out.println("****************************");
		System.out.println("Interrupted Thread!");
		System.out.println("****************************");
		t.interrupt();
	}
} 



运行这个程序,我们发现调用interrupt()后,程序仍在运行,如果不强制结束,程序将一直运行下去,如下所示:

Java代码 复制代码

 

......
I am running!
I am running!
I am running!
I am running!
****************************
Interrupted Thread!
****************************
I am running!
I am running!
I am running!
I am running!
I am running!
....


虽然中断发生了,但线程仍然在进行,离开线程有两种常用的方法:
抛出InterruptedException和用Thread.interrupted()检查是否发生中断,下面分别看一下这两种方法:
1.在阻塞操作时如Thread.sleep()时被中断会抛出InterruptedException(注意,进行不能中断的IO操作而阻塞和要获得对象的锁调用对象的synchronized方法而阻塞时不会抛出InterruptedException)

Java代码 复制代码

 

class ATask implements Runnable{

	private double d = 0.0;
	
	public void run() {
		//死循环执行打印"I am running!" 和做消耗时间的浮点计算
		try {
			while (true) {
				System.out.println("I am running!");
				
				for (int i = 0; i < 900000; i++) {
					d =  d + (Math.PI + Math.E) / d;
				}
				//休眠一断时间,中断时会抛出InterruptedException
				Thread.sleep(50);
			}
		} catch (InterruptedException e) {
			System.out.println("ATask.run() interrupted!");
		}
	}
}


程序运行结果如下:

Java代码 复制代码
I am running!
I am running!
****************************
Interrupted Thread!
****************************
ATask.run() interrupted!


可以看到中断任务时让任务抛出InterruptedException来离开任务.

2.Thread.interrupted()检查是否发生中断.Thread.interrupted()能告诉你线程是否发生中断,并将清除中断状态标记,所以程序不会两次通知你线程发生了中断.

Java代码 复制代码

 

class ATask implements Runnable{

	private double d = 0.0;
	
	public void run() {
		
		//检查程序是否发生中断
		while (!Thread.interrupted()) {
			System.out.println("I am running!");

			for (int i = 0; i < 900000; i++) {
				d = d + (Math.PI + Math.E) / d;
			}
		}

		System.out.println("ATask.run() interrupted!");
	}
}


程序运行结果如下:

Java代码 复制代码

 

I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
I am running!
****************************
Interrupted Thread!
****************************
ATask.run() interrupted!



我们可结合使用两种方法来达到可以通过interrupt()中断线程.请看下面例子:

Java代码 复制代码

 

class ATask implements Runnable{

	private double d = 0.0;
	
	public void run() {
		
		try {
		//检查程序是否发生中断
		while (!Thread.interrupted()) {
			System.out.println("I am running!");
			//point1 before sleep
			Thread.sleep(20);
			//point2 after sleep
			System.out.println("Calculating");
			for (int i = 0; i < 900000; i++) {
				d = d + (Math.PI + Math.E) / d;
			}
		}
		
		} catch (InterruptedException e) {
			System.out.println("Exiting by Exception");
		}
		
		System.out.println("ATask.run() interrupted!");
	}
}


在point1之前处point2之后发生中断会产生两种不同的结果,可以通过修改InterruptTaskTest main()里的Thread.sleep()的时间来达到在point1之前产生中断或在point2之后产生中断.
如果在point1之前发生中断,程序会在调用Thread.sleep()时抛出InterruptedException从而结束线程.这和在Thread.sleep()时被中断是一样的效果.程序运行结果可能如下:

Java代码 复制代码

 

I am running!
Calculating
I am running!
Calculating
I am running!
Calculating
I am running!
****************************
Interrupted Thread!
****************************
Exiting by Exception
ATask.run() interrupted!


如果在point2之后发生中断,线程会继续执行到下一次while判断中断状态时.程序运行结果可能如下:

Java代码 复制代码
  1. I am running!   
  2. Calculating   
  3. I am running!   
  4. Calculating   
  5. I am running!   
  6. Calculating   
  7. ****************************   
  8. Interrupted Thread!   
  9. ****************************   
  10. ATask.run() interrupted!  


            

转自 http://hapinwater.iteye.com/blog/310558

 

分享到:
评论

相关推荐

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

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

    java 线程工具类 java 线程工具类

    java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具...

    Java线程(第三版)

    中断机制是Java中优雅停止线程的关键。 另外,Java并发工具库(java.util.concurrent)是Java 5引入的一大亮点,书中可能会详细介绍`ConcurrentHashMap`, `BlockingQueue`, `Future`和`Callable`等接口和类,这些都...

    java线程中断之interrupt和stop.docx

    ### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件下停止某个线程的执行,或者中断正在等待的线程。Java提供了多种...

    Java线程详解大全

    线程组可以包含线程和其他线程组,可以设置权限,也可以进行统一的中断或中止操作。 总之,Java线程是并发编程的基础,理解和掌握线程的生命周期、实现方式和同步机制对于编写高效、安全的多线程程序至关重要。在...

    java线程实例 各种小Demo

    Java线程是多任务编程的重要概念,它允许程序同时执行多个独立的任务,从而提高系统效率和响应速度。在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台...

    java通过线程控制程序执行超时(新)

    Java的线程提供了中断机制,通过`Thread.interrupt()`和`Thread.isInterrupted()`方法来控制和检查线程中断状态。在长时间运行的任务中,应定期检查中断标志,一旦检测到中断,及时清理资源并退出。 ```java ...

    Java线程.ppt

    `sleep()`方法让线程进入堵塞状态,`join()`方法等待线程执行完成,`yield()`方法让当前线程让出CPU,`stop()`方法停止线程(不推荐使用,因为可能引起数据不一致),`interrupt()`方法中断线程,以及`wait()`和`...

    java 线程 dump 分析工具 2.3.3

    java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...

    java 线程相关工具类

    java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类.java 线程相关工具类....

    Java线程使用教程

    4. **Atomic* 类**:提供原子操作的类,如`AtomicInteger`,保证在多线程环境下变量的更新不被中断。 五、死锁与活锁 1. **死锁**:两个或多个线程相互等待对方释放资源,导致无法继续执行的状态。避免死锁的关键...

    java线程.rar

    9. **线程中断**:通过`interrupt()`方法设置线程的中断标志,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求。 10. **线程Local变量**:`ThreadLocal`类为每个线程提供独立的变量副本,...

    java多线程Demo

    - interrupt()方法用于中断线程,如果线程正在阻塞(如sleep或wait),会被中断并抛出InterruptedException。 通过这些技术,我们可以构建高效、稳定、响应迅速的多线程应用程序。在实际开发中,应根据具体需求...

    java线程实战手册

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

    JAVA线程学习(源代码)

    Java提供了多种方法来控制线程状态,如`start()`启动线程,`sleep()`使线程暂停,`join()`等待线程完成,以及`interrupt()`中断线程。 并发控制是线程编程中的重要部分。Java提供了synchronized关键字来实现互斥...

    JAVA线程dump的分析

    JAVA线程dump的分析 JAVA线程dump是指在JAVA程序中,当前线程的状态和调用堆栈的快照,能够帮助开发者了解当前程序的执行情况,诊断问题和性能瓶颈。生成JAVA线程dump的方法在不同的操作系统下是不同的,在Windows...

    java线程与并发编程实践

    线程的中断(interrupt())和检查中断状态(isInterrupted()、interrupted())是处理异常情况的关键。同时,当一个线程抛出未捕获异常时,会终止该线程并通知其父线程。 在《java线程与并发实践编程》中,作者Jeff ...

    Java-并发-Java线程中断与停止线程详解

      Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。即“线程中断”并不是字面意思——线程真的中断了,而是设置了中断标志...

    java多线程的讲解和实战

    9. **线程中断**:`interrupt()`方法可以标记线程中断状态,线程可以通过检查`isInterrupted()`或`interrupted()`方法来响应中断请求,从而优雅地停止线程执行。 10. **线程局部变量(ThreadLocal)**:为每个线程...

    简单的java线程demo

    - `interrupt()`: 标记线程为中断状态,线程在检查到中断标志时可以决定如何响应。 - `synchronized`: 关键字用于同步访问共享资源,防止数据不一致性。 了解并熟练掌握这些线程操作是编写高效并发程序的基础。在...

Global site tag (gtag.js) - Google Analytics