周围有很多成语

InterruptedException

但问题是关于显式检查中断状态。

我的理解是

isInterrupted

(实例方法)不应主要用于日志记录和调试等。它只提供给定线程上标志的快照,该快照很快就会过时。

通常的习惯用法是检查

interrupted

(静态方法)如果您正在编写一个要在某一点取消的任务

调用一些抛出的东西

中断例外

由于睡眠或阻塞I/O调用等原因。如果看到标志集,则应尽快停止当前计算,提前返回或引发异常(可能

中断例外

)

例如,如果你的任务看起来像

void process(Things[] things) throws InterruptedException {

for (Thing thing : things) {

thing.twiddle(); // this call throws InterruptedException

}

}

那你就不需要做其他的事了;如果有人打电话来

Thread.interrupt

在您的线程上,在当前或下一个线程中

twiddle

打电话给某人

中断例外

将被抛出并停止您的任务。

但是如果

闲逛

中断例外

一般不能在中间中断?假设每次这样的呼叫需要100毫秒,但是

things.length

可能是100。然后

process

可能会被阻止10秒,即使有人试图中断它,这在您的应用程序中可能是不可接受的。因此,您可以显式检查中断:

void process(Things[] things) {

if (Thread.interrupted()) {

return;

}

for (Thing thing : things) {

thing.twiddle();

}

}

在这里你可以看到为什么

打断

自动检查和清除标志:您正在使用它来确认收到一条消息,有人礼貌地要求您尽快停止。(在本例中,在请求的大约100毫秒内)您还可以看到为什么这必须是一个静态方法,在当前线程上操作:它只在检查是否应该停止周围代码的上下文中才有意义。

当然,如果

过程

假设它运行到完成,简单地说

return

如图所示,这会产生误导。所以你可能想

过程

返回它完成处理的事物的数量,或者更适合引发异常:

void process(Things[] things) throws InterruptedException {

if (Thread.interrupted()) {

throw new InterruptedException();

}

for (Thing thing : things) {

thing.twiddle();

}

}

在这种情况下,调用者会收到一个(选中的)异常,通知他们有人要求停止中间的处理。通常,调用者应该让异常被抛出调用堆栈。

如果您无法停止当前任务,但需要知道停止任务的请求确实出现了,例如缩短剩余工作时间,那么您也可以重新惊吓自己:

void process(Things[] things) {

boolean twiddleFully = true;

if (twiddleFully && Thread.interrupted()) {

twiddleFully = false;

Thread.currentThread().interrupt();

}

for (Thing thing : things) {

thing.twiddle(twiddleFully);

}

}

在这里,我们可以更快地处理剩余的事情,但仍然可以完成循环,并重新打开中断标志,以便调用者决定处理它。

java 线程间_Java:线程间的用法不同。相关推荐

  1. java+向前进一_Java 线程基础

    前言 线程并发系列文章: 熟练掌握线程原理与使用是程序员进阶的必经之路,网上很多关于Java线程的知识,比如多线程之间变量的可见性.操作的原子性,进而扩展出的Volatile.锁(CAS/Synchr ...

  2. java 线程机制_Java线程机制学习

    前面的文章中总结过Java中用来解决共享资源竞争导致线程不安全的几种常用方式: synchronized: ReentrantLock: ThreadLocal: 这些都是在简单介绍了基本用法的基础上 ...

  3. java线程触发_java线程

    线程. 状态 新建状态(New): 当用 new 操作符创建一个线程时, 例如 new Thread(r),线程还没有开始运行,此时 线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线 ...

  4. java 线程状态_JAVA线程漫谈:线程状态与状态转换解析

    线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...

  5. java 线程状态_Java线程为何没有Running状态?我猜你不知道。

    作者:国栋原文:https://my.oschina.net/goldenshaw/blog/705397 Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事.具体而言, ...

  6. java线程 属性_Java 线程基础

    本文部分摘自<Java 并发编程的艺术> 线程简介 1. 什么是线程? 现代操作系统在运行一个程序时,会为其创建一个进程,一个进程里可以创建多个线程.现代操作系统调度的最小单元是线程,也叫 ...

  7. java线程协作_java线程系列之三(线程协作)

    上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者问题是一个经典的线程同步以及通信的案例.该问题描述了两个共享固定大小缓冲区的线程,即所谓 ...

  8. 苹果系统手机调用java线程出错_Java线程面试题

    2) 线程和进程有什么区别? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.线程是进程的子集,一个进程可以有很多线程, ...

  9. java dump 工具_Java线程Dump分析工具--jstack

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...

  10. java中我爱你_Java线程学习(转)

    编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:s ...

最新文章

  1. 企业网站外链发布有技巧
  2. mysql 将时间戳直接转换成日期时间,mysql查询某一天的数据。
  3. 最小树形图+朱刘算法
  4. swappiness
  5. assets目录与res/raw目录下文件的区别
  6. linux添加后门方法,超初级的linux后门制作方法
  7. 深度学习VS机器学习——到底什么区别
  8. 很多时候的心情,是需要一个无人的角落
  9. 易我数据恢复向导 v2.0 官网
  10. PostmanCn: Postman中文版
  11. spec文件知识整理
  12. html图片缩放全部显示不全,100% width CSS 在缩小/放大窗口时候内容被截断或显示不全...
  13. ubuntu 中清理文件
  14. 三菱je-a系列伺服支持modbusrtu 协议吗_你了解吗?全新正品英飞凌模块全新现货...
  15. VIPL Lab 9篇ACM MM 2019和IEEE TIP 论文精解
  16. 通信专业实务(四)——互联网
  17. MVB总线在地铁列车控制系统中的应用
  18. Redis简介与基本使用
  19. ubuntu中将usb串口设备名称固定
  20. 50个直击灵魂的问题_质量管理50个常见问题详解

热门文章

  1. LVGL 8.2 Menu
  2. python修改全局变量
  3. 【已解决】labelme编辑label时,闪退;报错“IndexError: list index out of range”
  4. centos7.5安装无线网卡驱动
  5. 独立按键控制直流电机转动
  6. 组态王的日历控件Microsoft Date and Time Picker control 6.0(SP4)
  7. ORA-12514: TNS:listener does not currently know of service requested in connect descri
  8. 四川翌加:抖音合拍功能怎么使用?有什么好处?
  9. 1.20_Flink的Window全面解析\Keyed Windows\Window Assigners\Tumbling,Sliding,Session,Global,Window Function
  10. 关闭 macOS Microsoft Autoupdate程序