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

用interrupt()中断Java线程

    博客分类:
  • java
阅读更多
最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正.

假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢?

Java代码

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();    
    }    
}    
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!    
....   
......

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!");    
        }    
    }    
}   
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!  
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!");    
    }    
}   
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!  
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!");    
    }    
}   
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!  
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代码

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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kjniuzemin2003/archive/2009/06/30/4309876.aspx
分享到:
评论

相关推荐

    09.多线程编程基础-停止线程-使用interrupt方法中断线程.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    浅谈Java线程Thread之interrupt中断解析

    Java线程Thread之interrupt中断解析 Java线程Thread之interrupt中断机制是...Java线程Thread之interrupt中断机制是一种重要的机制,通过设置中断标记,可以控制线程的执行,并且可以避免使用stop方法对线程的中断。

    java线程中断之interrupt和stop.docx

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

    java线程中的interrupt,isInterrupt,interrupted方法

    在 Java 中,线程(Thread)类提供了三个相关的方法:interrupt、isInterrupted 和 interrupted,这三个方法都是用于处理线程的中断状态的。下面我们将详细介绍这三个方法的用法和区别。 interrupt 方法 interrupt...

    Java线程(第三版)

    《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多线程Demo

    Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...

    JAVA线程学习(源代码)

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

    java线程与并发编程实践

    Java线程与并发编程实践是Java开发者必备的技能之一,特别是在多核处理器和高并发应用环境中,有效地管理和利用线程能极大地提升程序的性能。本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,...

    java线程.rar

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

    电子书《java线程》

    线程的生命周期包括新建、就绪、运行、阻塞和终止等状态,理解这些状态以及如何在这些状态之间转换是理解和使用Java线程的基础。 书中可能涵盖了以下几个关键知识点: 1. **线程的创建与启动**:通过创建Thread...

    Java线程学习和总结

    Java提供了一些方法来控制线程状态,如`sleep()`使线程暂停执行一段时间,`join()`等待指定线程结束,`yield()`让当前线程暂停,让其他相同优先级的线程有机会执行,`interrupt()`用于中断线程。 同步是Java线程...

    Java线程超时监控

    如果超时,当前线程将恢复执行,并且可以通过调用`interrupt`来中断目标线程(但这并不意味着目标线程会立即停止,它可能需要在内部检查`isInterrupted()`或捕获`InterruptedException`来响应中断)。 在设计多线程...

    简单的java线程demo

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

    java多线程的讲解和实战

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

    java线程实战手册

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

    Java线程实例

    Java线程是多任务编程的重要概念,特别是在Java这种支持并发执行的语言中。在Java中,线程被用来实现程序中的并行操作,使得一个应用程序可以同时执行多个不同的任务。线程允许程序在处理一个任务的同时,也能响应...

    Java多线程之中断线程(Interrupt)的使用详解

    Java中的多线程允许并发执行多个任务,而中断机制是Java提供的一种优雅地停止线程执行的方式。`Thread.interrupt()`方法是中断线程的主要手段,但它的行为并不像字面意义上那样直接终止线程。相反,它通过设置线程的...

Global site tag (gtag.js) - Google Analytics