当前位置: 移动技术网 > IT编程>开发语言>Java > 基于JDK8总结java中的interrupt

基于JDK8总结java中的interrupt

2019年07月19日  | 移动技术网IT编程  | 我要评论

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<task> 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;
/**
 * created by wanshao
 * date: 2017/12/18
 * time: 下午3:42
 **/
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<integer> {
 private blockingqueue<task> 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,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网