Java怎样使用中断()终止线程

  介绍

这篇文章主要介绍了Java怎样使用中断()终止线程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>一、中断()说明

中断()的作用是中断本线程。

本线程中断自己是被允许的;其它线程调用本线程的中断()方法时,会通过checkAccess()检查权限。这有可能抛出SecurityException异常。

如果本线程是处于阻塞状态:调用线程的()等,等待(长)或等待(长,int)会让它进入等待(阻塞)状态,或者调用线程的加入(),加入(长),加入(长,int),睡眠(长),睡眠(长,int)也会让它进入阻塞状态。若线程在阻塞状态时,调用了它的中断()方法,那么它的“中断状态”会被清除并且会收到一个InterruptedException异常,例如,线程通过等()进入阻塞状态,此时通过中断()中断该线程;调用中断()会立即将线程的中断标记设为“true”,但是由于线程处于阻塞状态,所以该“中断标记”会立即被清除为“false”,同时,会产生一个InterruptedException的异常。

如果线程被阻塞在一个选择器选择器中,那么通过中断()中断它时,线程的中断标记会被设置为真,并且它会立即从选择操作中返回。

如果不属于前面所说的情况,那么通过中断()中断线程时,它的中断标记会被设置为“true”。
中断一个“已终止的线程”不会产生任何操作。

<强>二,终止线程的方式

中线程的停止()和暂停()方法,由于固有的不安全性,已经建议不再使用。
下面,我先分别讨论线程在“阻塞状态”和“运行状态”的终止方式,然后再总结出一个通用的方式。

1,终止处于“阻塞状态”的线程

通常,我们通过“中断”方式终止处于“阻塞状态”的线程。

当线程由于被调用了睡眠()、()等,加入()等方法而进入阻塞状态,若此时调用线程的中断()将线程的中断标记设为真。由于处于阻塞状态,中断标记会被清除,同时产生一个InterruptedException异常。将InterruptedException放在适当的位置就能终止线程,形式如下:

@Override   public  void  run (), {   try {才能   ,,,while (真实),{   ,,,,,//,执行任务……   ,,,}   ,,},catch  (InterruptedException  ie), {,   ,,,//,由于产生InterruptedException异常,退出而(真正的)循环,线程终止!   ,,}   }

说明:在同时(真正的)中不断的执行任务,当线程处于阻塞状态时,调用线程的中断()产生InterruptedException中断。中断的捕获在时(真正的)之外,这样就退出了(真)时循环!

注意:对InterruptedException的捕获务一般放(真)时在循环体的外面,这样,在产生异常时就退出了(真)时循环。否则,InterruptedException(真)时在循环体之内,就需要额外的添加退出处理。形式如下:

@Override   public  void  run (), {   while 才能;(真实),{   ,,,try  {   ,,,,,//,执行任务……   ,,,},catch  (InterruptedException  ie), {,   ,,,,,//,InterruptedException(真)时在循环体内。   ,,,,,//,当线程产生了InterruptedException异常时,(真)时仍能继续运行!需要手动退出   ,,,,,休息;   ,,,}   ,,}   }

说明:上面的InterruptedException异常的捕获在关于(真正的)之内。当产生InterruptedException异常时,被抓处理之外,仍然在,(真正的)循环体内,要退出而(真正的)循环体,需要额外的执行退出而(真实)的操作。

2,终止处于“运行状态”的线程

通常,我们通过“标记”方式终止处于“运行状态”的线程。其中,包括”中断标记”和“额外添加标记”。

(1)通过“中断标记”终止线程

形式如下:

@Override   public  void  run (), {   while 才能;(! isInterrupted ()), {   ,,,//,执行任务……   ,,}   }

说明:isInterrupted()是判断线程的中断标记是不是为真的。当线程处于运行状态,并且我们需要终止它时,可以调用线程的中断()方法,使用线程的中断标记为真,即isInterrupted()会返回正确的。此时,就会退出而循环。
注意:中断()并不会终止处于“运行状态”的线程!它会将线程的中断标记设为真。

(2)通过“额外添加标记”。

形式如下:

private  volatile  boolean 旗帜=,真的;   protected  void  stopTask (), {   时间=flag 才能;假;   }      @Override   public  void  run (), {   while 才能;(国旗),{   ,,,//,执行任务……   ,,}   }

Java怎样使用中断()终止线程