博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle官方并发教程之中断
阅读量:7063 次
发布时间:2019-06-28

本文共 1383 字,大约阅读时间需要 4 分钟。

,,译者: 蘑菇街-小宝   校对:梁海舰

中断是给线程的一个指示,告诉它应该停止正在做的事并去做其他事情。一个线程究竟要怎么响应中断请求取决于程序员,不过让其终止是很普遍的做法。这是本文重点强调的用法。

一个线程通过调用对被中断线程的Thread对象的interrupt()方法,发送中断信号。为了让中断机制正常工作,被中断的线程必须支持它自己的中断(即要自己处理中断)

中断支持

线程如何支持自身的中断?这取决于它当前正在做什么。如果线程正在频繁调用会抛InterruptedException异常的方法,在捕获异常之后,它只是从run()方法中返回。例如,假设在SleepMessages的例子中,关键的消息循环在线程的Runnable对象的run方法中,代码可能会被修改成下面这样以支持中断:

01 for (int i = 0; i < importantInfo.length; i++) {
02     // Pause for 4 seconds
03     try {
04        Thread.sleep(4000);
05     } catch (InterruptedException e) {
06        // We've been interrupted: no more messages.
07       return;
08  }
09  // Print a message
10  System.out.println(importantInfo[i]);
11 }

许多会抛InterruptedException异常的方法(如sleep()),被设计成接收到中断后取消它们当前的操作,并在立即返回。

如果一个线程长时间运行而不调用会抛InterruptedException异常的方法会怎样? 那它必须周期性地调用Thread.interrupted()方法,该方法在接收到中断请求后返回true。例如:

1 for (int i = 0; i < inputs.length; i++) {
2     heavyCrunch(inputs[i]);
3     if (Thread.interrupted()) {
4         // We've been interrupted: no more crunching.
5         return;
6     }
7 }

在这个简单的例子中,代码只是检测中断,并在收到中断后退出线程。在更复杂的应用中,抛出一个InterruptedException异常可能更有意义。

1 if (Thread.interrupted()){
2    throw new InterruptedException();
3 }

这使得中断处理代码能集中在catch语句中。

中断状态标记

中断机制通过使用称为中断状态的内部标记来实现。调用Thread.interrupt()设置这个标记。当线程通过调用静态方法Thread.interrupted()检测中断时,中断状态会被清除。非静态的isInterrupted()方法被线程用来检测其他线程的中断状态,不改变中断状态标记。

按照惯例,任何通过抛出一个InterruptedException异常退出的方法,当抛该异常时会清除中断状态。不过,通过其他的线程调用interrupt()方法,中断状态总是有可能会立即被重新设置。 

转载地址:http://xksll.baihongyu.com/

你可能感兴趣的文章
关于LightMapping和NavMesh烘焙的动态载入
查看>>
(转)Android中使用ormlite实现持久化(一)--HelloOrmLite
查看>>
C语言近程型(near)和远程型(far)的区别是什么?
查看>>
jQuery选择器总结
查看>>
《Continuous Delivery》 Notes 1: The problem of delivering software
查看>>
java android 将小数度数转换为度分秒格式
查看>>
一张图知道HTML5布局(图)
查看>>
LINQ To SQL在N层应用程序中的CUD操作、批量删除、批量更新
查看>>
在网站开发中很有用的8个 jQuery 效果【附源码】
查看>>
桥牌笔记:Skill Level 4 D8
查看>>
[翻译] RSKImageCropper
查看>>
javaweb学习总结(三十)——EL函数库
查看>>
我在开发第一个Swift App过程中学到的四件事
查看>>
DataGridView隔行显示不同的颜色
查看>>
在C#后端处理一些结果然传给前端Javascript或是jQuery
查看>>
Android灭亡论之Firefox OS操作系统出现
查看>>
Mean Shift具体介绍
查看>>
HTML5 <details> 标签
查看>>
递归与尾递归(C语言)
查看>>
【phonegap】下载文件
查看>>