栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

基于JDK8总结java中的interrupt

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于JDK8总结java中的interrupt

1. interrupt知识点

 以下总结基于JDK8

本文不会完整说明interrupt,只会罗列一些比较重要的点。完整了解Thread.interrupt可以看参考资料。

以下的一些理解新的有助于理解参考资料的文章:

interrupt方法调用后,针对BLOCKED状态的线程,只是设定中断标志位为true。是否响应中断(感知这个标志位的变化)取决于API的设计。JDK的阻塞IO API、Synchronized同步块、还有Lock中的很多方法(不包括lockInterruptibly)都是不响应中断的。当然调用线程可以利用标志位判断来使得自己设计的API是可响应中断的。

interrupt方法调用后,针对WAITING/TIMED_WAITING状态的线程,会上抛interruptedException**并且设置中断标志位false**。例如线程调用Thread.sleep,Object.wait()之后。

如果线程尚未启动(NEW),或者已经结束(TERMINATED),则调用interrupt()对它没有任何效果,中断标志位也不会被设置。

最佳实践:有时候一些方法设计上不允许被中断或者取消,但是当别的线程发来中断请求的时候,也需要进行标记的保留,方便其他调用方“了解情况”

public Task getNextTask(BlockingQueue queue) {
 boolean interrupted = false;
 try {
  while (true) {
   try {
    return queue.take();
   } catch (InterruptedException e) {
    //fianlly中依赖的状态标记
    interrupted = true;
    // fall through and retry
   }
  }
 } finally {
  if (interrupted)
  //在fianlly中重新标记,确保没有丢失中断通知
   Thread.currentThread().interrupt();
 }
}

利用中断可以实现一些cancel的操作。例如:

package concurrent;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class InterruptExample {
 public static void main(String[] args) throws InterruptedException {
  InterruptTask interruptTask = new InterruptTask();
  ExecutorService executorService = Executors.newSingleThreadExecutor();
  executorService.submit(interruptTask);
  Thread.sleep(100);
  interruptTask.cancel();
  executorService.shutdown();
 }
}

class InterruptTask implements Callable {
 private BlockingQueue queue;
 //保存要被interrupt的线程
 Thread t;
 @Override
 public Integer call() throws InterruptedException {
  System.out.println("start a blocked task");
  try {
   t = Thread.currentThread();
   Thread.currentThread().sleep(50000);
  } catch (InterruptedException e) {
   System.out.println("be interrupted");
   e.printStackTrace();
  }
  return 0;
 }
 public void cancel() {
  System.out.println("cacel a task....");
  //这里直接调用Thread.currentThread()会获取到main线程,而不是线程池里面的线程
  if (!t.isInterrupted()) {
   t.interrupt();
  }
 }
}

总结

以上所述是小编给大家介绍的基于JDK8总结java中的interrupt,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/142490.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号