梦想飞翔

自强不息
posts - 111, comments - 30, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1.2中断线程

Posted on 2009-02-25 14:29 love1563 阅读(206) 评论(0)  编辑  收藏 所属分类: Java语言*高级版

        线程将在它的run方法返回时终止。在    JDK1.0中,还存在一个stop方法,其他线程可以调用它来终止线程。不过这个方法现在已经被弃用了。
        尽管现在已经没有强制终止线程的方法了,但是你还是可以用interrupt方法来请求终止一个线程。

        当interrupt方法在一个线程上被调用时,该线程的中断状态(interrupted status)将会被置位。这是一个布尔型的标志,存在于每一个线程之中。每个线程都应该不时地检查这个标志,已判断线程是否应该被中断。
        为了查明中断状态是否被置位了,需要首先调用静态的thread.currentThread方法来取得当前线程,然后调用它的isInterrupted方法:
        
while(!Thread.currentThread().isInterrupted()&&more work to do)
{
     
do more work
}
        尽管如此,如果一个线程被阻塞了,它就无法检查中断状态了。这就是产生InterruptedException异常的地方。当在一个被阻塞的线程上调用interrupt()方式时,阻塞调用(例如sleep或者wait)就会被InterruptedException异常终止。
        没有任何语言方面的需求要求一个被中断的线程应该终止。中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断。某些线程非常重要,以至于它们应该不理会中断,而是在处理完抛出的异常之后继续执行。但是更普遍的情况是,一个线程将把中断看做一个终止请求。这种线程的run()方法遵循如果的形式:

        
    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
    }
            如果你在每次工作迭代之后都调用sleep方法,那么这个inIterrupted检查就不是必须的。如果你在中断状态被置位时调用sleep方法,那么sleep方法将抛出一个InterruptedException异常。因此,如果你循环调用sleep,就要花点心思检查中断状态并捕获
InterruptedException异常。这样的run方法的形式如下所示:
    public void run()
    
{
       
try {
        .
        
        
while (more work to do{

            
do more work
            Thread.sleep(delay);
        }

    }
 catch (InterruptedException e) {
        Thread was interrupted during sleep or wait
    }
 finally{
        cleanup 
if required
    }

    
//exiting the run method terminates the thread
    }

 

        当sleep方法抛出一个InterruptedException异常时,它同时也会清除中断状态。
        你会在很多发布的代码中发现InterruptedException异常被抑制在了一个很低的层次上,就像这样:

public void mySubTask()
    
{
       
try {
                Thread.sleep(delay);
        }

    }
 catch (InterruptedException e) {}//don't ignore
        
    }

        不要这样做!如果你不能很好地在catch字句中来处理异常,那么你还又两个合理的选择:
        1)在catch字句中,调用Thread.currentThread().interrupt()来设置中断状态。然后调用者可以对其进行测试:

public void mySubTask()
    
{
       
try {
                Thread.sleep(delay);
        }

    }
 catch (InterruptedException e) {Thread.currentThread().interrupt()}
        
    }

 

        2)或者更好的方法,标记你的方法将抛出InterruptedException异常,让调用(或者,最终的run方法)就能够捕获该异常。

    public void mySubTask() throws InterruptedException
    
{
                Thread.sleep(delay);
    }
      线程如果中断后再休眠则会修改中断状态。

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问