Java中断机制(interrupt)
while (!Thread.currentThread().interrupted() && more work to do) {}
interrupted 和 isInterrupted 区别
@Override
public void run() {
while(!Thread.currentThread().isInterrupted() ){
try{
//处理正常的逻辑
Thread.sleep(100);
}catch (InterruptedException e){
//被中断后的进入 //由于抛出异常后会把状态位改变,所以这里应该手动改变状态位
Thread.currentThread().interrupt();
}finally{
// 线程结束前的后续操作
}
}
}
@Override
public void run() {
try{
Thread.sleep(100);
}catch (InterruptedException e){ }
}
 void mySubTask() throws InterruptedException {
            ...
         sleep(delay);
            ...
 }
 public class Example1 implements Runnable{
     private float d;
     @Override
     public void run() {
         while(true){
             for(int i=0;i<10000000;i++){
                 d = (float) (d + (Math.PI + Math.E) / d);
             }
             System.out.println("I'm counting......");
             //转让调度器使用权
             Thread.yield();
         }
     }
     public static void main(String[] args) throws InterruptedException {
         Example1 example1 = new Example1();
         Thread t1 = new Thread(example1);
         t1.start();
         Thread.sleep(100);
         System.out.println("开始中断线程。。。。。。");
         t1.interrupt();
     }
 }
输出:
I'm counting......
开始中断线程。。。。。。
I'm counting......
I'm counting......
I'm counting......
I'm counting......
方法一:信号量法
 class Example2 implements Runnable{
     public static boolean isLive = true;
     float d;
     @Override
     public void run() {
         while(isLive){
             for(int i=0;i<10000000;i++){
                 d = (float) (d + (Math.PI + Math.E) / d);
             }
             System.out.println("I'm counting......");
             //转让调度器使用权
             Thread.yield();
         }
     }
     public static void main(String[] args) throws InterruptedException {
         Example2 e2 = new Example2();
         Thread t1 = new Thread(e2);
         t1.start();
         Thread.sleep(100);
         System.out.println("开始中断线程。。。。。。");
         //设置改变信号量
         e2.isLive = false;
     }
 }
输出结果:
I'm counting......
开始中断线程。。。。。。
I'm counting......
方法二:抛出异常法
 public class Example1 implements Runnable{
         private double d = 0.0;
         public void run() {
             //死循环执行打印"I am running!" 和做消耗时间的浮点计算
             try {
                 while (true) {
                     System.out.println("I am running!");
                     for (int i = 0; i < 900000; i++) {
                         d =  d + (Math.PI + Math.E) / d;
                     }
                     //休眠一断时间,中断时会抛出InterruptedException
                     Thread.sleep(50);
                 }
             } catch (InterruptedException e) {
                 System.out.println("ATask.run() interrupted!");
             }
     }
     public static void main(String[] args) throws InterruptedException {
         Example1 example1 = new Example1();
         Thread t1 = new Thread(example1);
         t1.start();
         Thread.sleep(100);
         System.out.println("开始中断线程。。。。。。");
         t1.interrupt();
     }
 }
输出结果
I am running!
I am running!
开始中断线程。。。。。。
ATask.run() interrupted!
方法三:Thread.interrupted()监听
 class Example3 implements Runnable {
     @Override
     public void run() {
         while (!Thread.currentThread().interrupted()) {
             try {
                 Thread.sleep(100);
                 System.out.println("I'm counting......");
             } catch (InterruptedException e) {
                 //设置状态位
                 Thread.currentThread().interrupt();
             }
         }
     }
     public static void main(String[] args) throws InterruptedException {
         Example3 e = new Example3();
         Thread t1 = new Thread(e);
         t1.start();
         Thread.sleep(800);
         System.out.println("开始中断线程。。。。。。");
         t1.interrupt();
     }
 }
输出为:
I'm counting......
I'm counting......
I'm counting......
I'm counting......
I'm counting......
I'm counting......
开始中断线程。。。。。。
Java中断机制(interrupt)的更多相关文章
- 【转】详细分析Java中断机制
		
原文地址:http://www.infoq.com/cn/articles/java-interrupt-mechanism 1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制 ...
 - 详细分析Java中断机制(转)
		
1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...
 - 详细分析Java中断机制-转载
		
1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...
 - 详细分析Java中断机制[转]
		
1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...
 - Java中断机制
		
1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...
 - Java并发(基础知识)—— Java中断机制
		
上文讲解了Java线程的创建.启动以及停止,在讲到停止线程时说到了Java中断,Java中断是停止线程的一种协作机制,本文打算对Java中断机制进行详细讲解. 在网上搜索Java中断机制,发现两篇好文 ...
 - Java Thread.interrupt interrupted
		
Java Thread.interrupt @(Base)[JDK, 线程, interrupt] 原文地址,转载请注明 下面这个场景你可能很熟悉,我们调用Thread.sleep(),conditi ...
 - Java面试-interrupt
		
我们都知道,Java中停止一个线程不能用stop,因为stop会瞬间强行停止一个线程,且该线程持有的锁并不能释放.大家多习惯于用interrupt,那么使用它又有什么需要注意的呢? interrupt ...
 - java中interrupt,interrupted和isInterrupted的区别
		
文章目录 isInterrupted interrupted interrupt java中interrupt,interrupted和isInterrupted的区别 前面的文章我们讲到了调用int ...
 
随机推荐
- Ghost文件封装说明
			
一.先列举目前Windows系统安装方式: 1.光盘安装 1.1 使用可刻录光驱将系统ISO文件刻录至DVD光盘,刻录工具比较多,QA目前使用Ultra ISO. 1.2 安装电脑从DVD光盘启动,无 ...
 - Python 基础系列一:初识python(二)基本数据类型
			
上节拾遗 1.编码转换过程,utf-8转换gbk 过程 经过解码(py27): x.decode('utf-8')-->unicode-->编码x.encode('gbk') ps:py3 ...
 - 通过ssh秘钥的方式可以连接上CE68交换机
			
结论:按照CE68交换机的用户手册中的指导,可以通过ssh 秘钥的方式连接上交换机. 1.先按照eNSP连接到网卡的方式,给CE68配置一个ip地址: 192.168.56.2 2.按照交换机的用户指 ...
 - JS中的作用域以及全局变量的问题
			
一. JS中的作用域 1.全局变量:函数外声明的变量,称为全部变量 局部变量:函数内部使用var声明的变量,称为局部变量在JS中,只有函数作用域,没有块级作用域!!!也就是说,if/for等有{}的结 ...
 - Android Annotations(2)
			
AndroidAnnotations是一个开源框架,旨在加快Android开发的效率.通过使用它开放出来的注解api,你几乎可以使用在任何地方, 大大的减少了无关痛痒的代码量,让开发者能够抽身其外,有 ...
 - Fatal error in launcher:Unable to create process using '"'
			
Windows下同时存在Python2和Python3使用pip时系统报错:Fatal error in launcher: Unable to create process using '" ...
 - RT5350 OpenWrt 系统移植jsoncpp
			
下载Json包: 下载地址:http://sourceforge.net/projects/jsoncpp/ 如:jsoncpp-src-0.5.0.tar.gz 交叉编译: 1.解压jsoncpp- ...
 - 如何学习LoadRunner性能测试?
			
最近组内同事针对性能测试LR的脚本部分做了介绍,是个不错的分享.会后反思自己也有很长一段时间没做性能测试了,根据以往的经验,有必要做些整理和补充,本文主要介绍一些Loadrunner性能测试的学习方法 ...
 - 64、django之模型层(model)--建表、查询、删除基础
			
要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...
 - [POJ 1410] Intersection(线段与矩形交)
			
题目链接:http://poj.org/problem?id=1410 Intersection Time Limit: 1000MS Memory Limit: 10000K Total Sub ...