欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于JDK8总结java中的interrupt

程序员文章站 2024-02-17 17:58:16
1. interrupt知识点  以下总结基于jdk8 本文不会完整说明interrupt,只会罗列一些比较重要的点。完整了解thread.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<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,希望对大家有所帮助