黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: jix707    时间: 2013-8-13 14:56
标题: 多线程问题

作者: 赵国刚    时间: 2013-8-13 15:10
在JDK1.0中,可以用stop方法来终止,但是现在这种方法已经被禁用了,改用interrupt方法。

Thread.interrupt()方法不会中断一个正在运行的线程。它的作用是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

interrupt方法并不是强制终止线程,它只能设置线程的interrupted状态,而在线程中一般使用一下方式:
while (!Thread.currentThread().isInterrupted() && more work to do)

{...}

而被block的线程(sleep() or join())在被调用interrupt时会产生InterruptException,此时是否终止线程由本线程自己决定。程序的一般形式是:
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
}
// exiting the run method terminates the thread
}

Thread.sleep方法也会产生InterruptedException,因此,如果每次在做完一些工作后调用了sleep方法,那么就不用检查isInterrupted,而是直接捕捉InterruptedException。

---------------------------------------------------------------------------------------

假如我们有一个任务如下,交给一个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()后,程序仍在运行,如果不强制结束,程序将一直运行下去,如下所示:
......  
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()检查是否发生中断,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2