`
MauerSu
  • 浏览: 514984 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

中断线程 —— interrupt()

 
阅读更多
源:http://blog.csdn.net/budapest/article/details/6941802
评:
一个正在运行的线程除了正常的时间片中断之外,能否被其他线程控制?或者说其他线程能否让指定线程放弃CPU或者提前结束运行? 除了线程同步机制之外,还有两种方法:
       (1) Thread.stop(), Thread.suspend(), Thread.resume() 和Runtime.runFinalizersOnExit() 这些终止线程运行的方法 。这些方法已经被废弃,使用它们是极端不安全的。
       (2) Thread.interrupt() 方法是很好的选择。但是使用的时候我们必须好好理解一下它的用处。
[java] view plaincopy

    //无法中断正在运行的线程代码   
    class TestRunnable implements Runnable{   
          public void run(){   
                while(true)   
                {   
                      System.out.println( "Thread is running..." );   
                      long time = System.currentTimeMillis();//去系统时间的毫秒数   
                while((System.currentTimeMillis()-time < 1000)) {   
                       //程序循环1秒钟,不同于sleep(1000)会阻塞进程。   
                }   
                  }   
           }   
    }   
    public class ThreadDemo{   
             public static void main(String[] args){   
                   Runnable r=new TestRunnable();   
                   Thread th1=new Thread(r);   
                   th1.start();   
                   th1.interrupt();            
            }   
    }   
    /运行结果:一秒钟打印一次Thread is running...。程序没有终止的任何迹象  

上面的代码说明interrupt()并没有中断一个正在运行的线程,或者说让一个running中的线程放弃CPU。那么interrupt到底中断什么。
       首先我们看看interrupt究竟在干什么。
       当我们调用th1.interrput()的时候,线程th1的中断状态(interrupted status) 会被置位。我们可以通过Thread.currentThread().isInterrupted() 来检查这个布尔型的中断状态。
        在Core Java中有这样一句话:"没有任何语言方面的需求要求一个被中断的程序应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断 "。好好体会这句话的含义,看看下面的代码:
[java] view plaincopy

    //Interrupted的经典使用代码   
    public void run(){   
            try{   
                 ....   
                 while(!Thread.currentThread().isInterrupted()&& more work to do){   
                        // do more work;   
                 }   
            }catch(InterruptedException e){   
                        // thread was interrupted during sleep or wait   
            }   
            finally{   
                       // cleanup, if required   
            }   
    }   

很显然,在上面代码中,while循环有一个决定因素就是需要不停的检查自己的中断状态。当外部线程调用该线程的interrupt 时,使得中断状态置位。这是该线程将终止循环,不在执行循环中的do more work了。

       这说明: interrupt中断的是线程的某一部分业务逻辑,前提是线程需要检查自己的中断状态(isInterrupted())。

       但是当th1被阻塞的时候,比如被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞时。调用它的interrput()方法。可想而知,没有占用CPU运行的线程是不可能给自己的中断状态置位的。这就会产生一个InterruptedException异常。
[java] view plaincopy

     //中断一个被阻塞的线程代码 
    class TestRunnable implements Runnable{ 
         public void run(){ 
              try{ 
            Thread.sleep(1000000); //这个线程将被阻塞1000秒 
           }catch(InterruptedException e){ 
             e.printStackTrace(); 
                         //do more work and return. 
              } 
         } 
    } 
    public class TestDemo2{ 
          public static void main(String[] args) { 
                Runnable tr=new TestRunnable(); 
                Thread th1=new Thread(tr); 
                th1.start(); //开始执行分线程 
            while(true){ 
           th1.interrupt();  //中断这个分线程 
            } 
          } 
    } 
    /*运行结果:
       java.lang.InterruptedException: sleep interrupted
            at java.lang.Thread.sleep(Native Method)
            at TestRunnable.run(TestDemo2.java:4)
            at java.lang.Thread.run(Unknown Source)*/ 

* 如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用
* Object.wait()、ServerSocket.accept()和DatagramSocket.receive()时,他们都可能永
* 久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使
* 用某种机制使得线程更早地退出被阻塞的状态。很不幸运,不存在这样一种机制对所有的情况
* 都适用,但是,根据情况不同却可以使用特定的技术。使用Thread.interrupt()中断线程正
* 如Example1中所描述的,Thread.interrupt()方法不会中断一个正在运行的线程。这一方法
* 实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更
* 确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,
* 它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
分享到:
评论

相关推荐

    经典线程例子——Java线程学习指南

    Java提供了interrupt()方法来中断线程,但被中断的线程并不会立即停止,而是会在检查到中断标志时抛出InterruptedException,通常在循环中检查isInterrupted()来响应中断请求。 通过学习以上知识点,初学者可以对...

    Android线程结束——合理的结束你想结束的线程

    2. **使用interrupt()方法**:如果线程在循环或阻塞操作中,可以调用interrupt()方法来标记线程应该停止执行。在循环或阻塞操作中,应定期检查isInterrupted()状态,以便在收到中断信号后优雅地退出。 3. **线程的...

    Java 语法总结——线程(线程)

    3. 线程中断:通过Thread对象的interrupt()方法发送中断请求,线程内部可以通过isInterrupted()或interrupted()方法检查并响应中断。 4. 线程礼让:通过Thread.yield()方法让当前线程暂停,但不会释放CPU,而是让...

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

      该方法“中断线程”,但仅仅是会设置该线程的中断状态位为true,至于中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。   线程会不时地检测这个中断标示位,以判断线程...

    思维导图-多线程进阶总结02

    2. **Thread.interrupt()**:调用此方法会设置线程的中断状态,并且在某些阻塞操作(如wait()、sleep()、join())中会抛出InterruptedException,以此中断线程。 3. **共享变量**:通过共享变量通知线程停止工作,...

    Java面试之——线程编程方面

    现在推荐使用`interrupt()`来中断线程,或使用条件变量(如`wait()`, `notify()`, `notifyAll()`)控制线程的执行。 4. **`sleep()`与`wait()`的区别**: - `sleep()`是`Thread`类的方法,让当前线程休眠指定时间...

    多线程面试题

    9. **中断线程**:Thread类的interrupt()方法可以请求线程中断,但并不会立即停止线程,而是让线程在检查到中断标志后自行决定如何退出。 10. **守护线程(Daemon)**:守护线程是一种特殊的线程,当所有非守护线程...

    Java面试之——线程编程方面[借鉴].pdf

    现在推荐使用中断机制(`interrupt()`)来安全地停止线程。 4. **sleep() vs wait()**:`sleep()`使当前线程暂停一段时间,但不会释放锁。`wait()`则使线程进入等待状态,释放对象锁,直到其他线程调用`notify()`或...

    java线程入门 Java线程编程很好的入门书

    12. 中断机制:线程可以通过isInterrupted()和interrupt()方法来判断和设置中断状态。线程在执行过程中可以响应中断,通常通过检查中断状态并在适当位置抛出InterruptedException。 13. 异常处理:线程在执行过程中...

    java线程1-10-720p版本

    最后,"10_一天学会线程_线程中断.mp4"可能深入介绍了`interrupt()`和`isInterrupted()`方法的使用,以及如何处理中断异常`InterruptedException`。线程中断是一种协作机制,当一个线程被中断时,其他线程可以通过...

    java线程实战手册

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

    Java线程[文].pdf

    - **线程控制** 包括启动、停止、中断线程,以及设置优先级等,如`start()`、`stop()`(不推荐)、`interrupt()`、`setPriority()`等方法。 - **线程同步** 为了防止多个线程对共享资源的并发访问导致数据不一致,...

    中山大学研究生学院java讲义之(多线程)

    Thread类的interrupt()方法可以中断线程,线程可以通过检查isInterrupted()或抛出InterruptedException来响应中断请求。 十、并发工具类 Java并发包提供了一些并发工具类,如CountDownLatch、CyclicBarrier、...

    java线程基础讲解

    在Java中,线程是程序执行流的最小单元,一个标准的Java应用程序通常至少包含一个线程——主(main)线程。 **1.2 为什么使用线程?** 线程的主要用途在于提高程序的并发性和响应性。在多核处理器普及的今天,合理...

    面试题线程

    12. **中断线程**:线程可以通过interrupt()方法请求中断,但这并不意味着线程立即停止,而是设置了一个中断标志。线程需要在适当的地方检查isInterrupted()或interrupted()方法,以响应中断请求。 13. **守护线程...

    关闭线程.txt

    - **安全性问题**:`Thread.stop()`会立即中断线程,可能会导致线程在不安全的状态下被终止,例如在临界区内部,从而破坏数据一致性。 - **异常处理**:由于线程突然被停止,可能无法优雅地处理资源的释放,如关闭...

    java基础--11.多线程-1

    3. 线程中断:通过调用Thread类的interrupt()方法可以中断线程,线程可以通过检查isInterrupted()或interrupted()方法来响应中断请求。 四、线程状态 Java线程有五种基本状态:新建(New)、就绪(Runnable)、...

    Java线程知识

    - **interrupt()**:中断线程。 - **sleep(long millis)**:使当前线程暂停执行指定的时间,释放CPU给其他线程使用。 #### 五、线程安全问题 **5.1 线程安全的重要性** 由于多个线程可能同时访问共享资源,因此...

    java十大经典案例——时钟显示

    而`interrupt()`方法可以用来中断线程,比如停止时钟的运行。 10. **设计模式应用**: 在实现时钟显示功能时,可能会涉及观察者模式(Observer Pattern),使得时钟的变化可以被其他组件监听并做出相应反应。 这...

    多线程在Visual_Studio_C_的应用实例教程

    - `Interrupt()`: 中断处于等待状态的线程。 - `Join()`: 阻塞调用线程,直到目标线程结束。 - `ResetAbort()`: 取消由`Abort()`引发的操作。 - `Resume()`: 恢复暂停的线程。 - `Sleep(int milliseconds)`: 让当前...

Global site tag (gtag.js) - Google Analytics