文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>多线程3——中断线程

多线程3——中断线程

时间:2010-09-06  来源:朱宇华

不可以由一个线程去中断另一个线程,也没办法强制一个线程立即中止。只能由该线程自身提交中断请求,由操作系统根据情况自动处理。

     当在提交一个线程的中断请求命令前,往往需要先检查一下该线程是否处于非中断状态。如果该进程被阻塞,则该线程无法检查自身是否处于中断状态,并抛出InterruptedExeption异常(即由isInterrupted方法抛出该异常)。

 try
{
    while (!Thread.currentThread().isInterrupted()) //检查当前进程是否处于非中断状态

    {
        //do some work
    }
}
catch (InterruptedException e)
{
}

     中断一个线程并非是中止该线程(当然,大多数情况下,中断一个线程就是想中止它),中断线程的目的有的时候是让该线程进行计算或者分析,当线程恢复后该执行哪些命令。

     有些重要的线程,在被中断时即使抛出了InterruptedExeption异常,也还需要进行一些命令步骤,这些命令被卸载final{...}里面。

public void run()
{
    try
    {
        while (!Thread.currentThread().isInterrupted())
        {
           //do some work
        }
    }
    catch (InterruptedException e)
    {
        Thread.currentThread().interrupt();
    }

    final
    {
       //do some extra work       
    }
}

     如果每次执行完任意一个线程的命令后,都把该线程sleep了,则不需要用isInterrupted方法检查该线程是否处于中断状态。因为当一个线程处在sleep状态时,对该线程请求中断会自动抛出InterruptedException异常,所以就有:

public void run()
{
    try
    {
        while (some condition)
        {
           //do some work
           Thread.sleep(DELAYS);
        }
    }
    catch (InterruptedException e)
    {
        Thread.currentThread().interrupt();
    }
    final
    {
       //do some extra work        
    }
}

     除了上面的isInterrupted方法可以检查线程是否处于中断状态以外,还有interrupted方法也有类似的效果。它们之间的区别是:interrupted方法是一个静态方法,这样它只能检查当前线程是否处于中断状态;而isInterrupted方法是一个instance method,所以它用来检查任意一个线程是否处于中断状态。

 

注意:catch (InterruptedException e){...} 的时候,尽量不要把大括弧里的内容不写。即使你想不出来抓到异常后该做什么,也可以直接在大括号内写上:

catch (InterruptedException e)
{
    Thread.currentThread().interrupt(); //对当前线程直接抛出异常
}

或者干脆把异常throw掉,让使用它的程序来接受异常。总之不要把异常屏蔽掉。

public void myTask() throw interruptedException
{
    while (!Thread.currentThread().isInterrupted())
    {
        //do some work
    }
}

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载