需要恢复中断状态的一个场景

没有恢复中断状态时,在Step1执行期间发生中断,Step2操作还会继续,这就存在让数据出现不一致的风险:

import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*2015-4-9*/
public class InterruptedDemo {
    private static final Logger LOGGER=LoggerFactory.getLogger(InterruptedDemo.class);

    public static void main(String[] args) throws InterruptedException {
        Thread playgame=new Thread(new TaskRunner(), "do a work");
        playgame.start();

        int waitTime=5;
        LOGGER.info("tips: task will be cannel ,after {}s",waitTime);
        TimeUnit.SECONDS.sleep(waitTime);
        playgame.interrupt();
    }

}

class TaskRunner  implements Runnable{
    private static final Logger LOGGER=LoggerFactory.getLogger(TaskRunner.class);
    @Override
    public void run() {
        Step step1=new Step("step1",20);
        try {
            step1.process();
        } catch (InterruptedException e) {
            LOGGER.info("clean 、 backup or other business .............");
            LOGGER.error("step1 Fail",e);
//            Thread.currentThread().interrupt();
        }

        Step step2=new Step("step2",10);
        try {
            step2.process();
        } catch (InterruptedException e) {
            LOGGER.info("clean 、backup  or other business ............. ");
            LOGGER.error("step2 Fail",e);
//            Thread.currentThread().interrupt();
        }
    }

}

class Step{
    private static final Logger LOGGER=LoggerFactory.getLogger(Step.class);
    private String step;
    private int costTime;
    public Step(String step,int costTime) {
        this.step=step;
        this.costTime=costTime;
    }

    void process() throws InterruptedException{
            LOGGER.info("Step:{}",this.step);
            LOGGER.info("Need   {}s",this.costTime);
            TimeUnit.SECONDS.sleep(this.costTime);
            LOGGER.info("end ");
    }
}

Output:

[2015-04-10 01:37:57,634] [main] INFO - tips: task will be cannel ,after 5s
[2015-04-10 01:37:57,634] [do a work] INFO - Step:step1
[2015-04-10 01:37:57,635] [do a work] INFO - Need   20s
[2015-04-10 01:38:02,637] [do a work] INFO - clean 、 backup or other business .............
[2015-04-10 01:38:02,638] [do a work] ERROR - step1 Fail
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at java.lang.Thread.sleep(Thread.java:340)
    at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
    at thread.Step.process(InterruptedDemo.java:63)
    at thread.TaskRunner.run(InterruptedDemo.java:30)
    at java.lang.Thread.run(Thread.java:745)
[2015-04-10 01:38:02,641] [do a work] INFO - Step:step2
[2015-04-10 01:38:02,641] [do a work] INFO - Need   10s
[2015-04-10 01:38:12,641] [do a work] INFO - end 

传递中断状态的场景:
去掉上面代码中Thread.currentThread().interrupt();这句的注释

Output:

[2015-04-10 01:41:32,349] [do a work] INFO - Step:step1
[2015-04-10 01:41:32,350] [do a work] INFO - Need   20s
[2015-04-10 01:41:32,349] [main] INFO - tips: task will be cannel ,after 5s
[2015-04-10 01:41:37,351] [do a work] INFO - clean 、 backup or other business .............
[2015-04-10 01:41:37,352] [do a work] ERROR - step1 Fail
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at java.lang.Thread.sleep(Thread.java:340)
    at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
    at thread.Step.process(InterruptedDemo.java:63)
    at thread.TaskRunner.run(InterruptedDemo.java:30)
    at java.lang.Thread.run(Thread.java:745)
[2015-04-10 01:41:37,355] [do a work] INFO - Step:step2
[2015-04-10 01:41:37,355] [do a work] INFO - Need   10s
[2015-04-10 01:41:37,355] [do a work] INFO - clean 、backup  or other business .............
[2015-04-10 01:41:37,355] [do a work] ERROR - step2 Fail
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at java.lang.Thread.sleep(Thread.java:340)
    at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
    at thread.Step.process(InterruptedDemo.java:63)
    at thread.TaskRunner.run(InterruptedDemo.java:39)
    at java.lang.Thread.run(Thread.java:745)
时间: 2024-10-02 07:38:29

需要恢复中断状态的一个场景的相关文章

oracle恢复案例:rename一个数据文件后做不完全恢复

案例:rename一个数据文件后做不完全恢复 SQL>startup mount:   //启动到mount状态 SQL> show parameter control_files    //查看控制文件的位置信息 NAME                                 TYPE        VALUE ------------------------------------ ----------- ------------------------------ contro

TI CC2530基础实验(GPIO通用I/O中断操作——一个中断处理程序处理一个端口的多个中断)

有关CC2530的GPIO基本知识.普通GPIO操作有关寄存器的介绍.IAR Embedded Workbench IDE软件使用:TI CC2530基础实验(普通GPIO操作--点亮led灯) 有关CC2530通用I/O中断操作的基础知识.相关寄存器介绍:TI CC2530基础实验(GPIO通用I/O中断操作--按键控制灯的亮灭) 电路原理图: 程序: /************************************** * 基础实验只需要添加以下这个头文件即可 **********

isInterrupted()方法和Thread.interrupted()方法判断中断状态的区别

①isInterrupted()方法: 在Thread对象上调用isInterrupted()方法可以检查任何线程的中断状态,但是:线程一旦被中断,isInterrupted()方法便会返回true,而一旦sleep()方法抛出异常,它将恢复中断标志,isInterrupted()方法在此时就会返回false. 如下代码所示: ②Thread.interrupted()方法: Thread.interrupted()方法是静态方法,不能再特定的线程中使用,只能报告调用它的线程的中断状态: 如果当

Android——保存和恢复用户状态

onSaveInstanceState 保存 在暂停之后和保存之前调用 onRestoreInstanceState 恢复 再启动之后和显示之前调用 package com.example.chenshuai.excise; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View;

Android课程---Activity中保存和恢复用户状态

onSaveInstanceState 保存 在暂停之后和保存之前调用 onRestoreInstanceState 恢复 再启动之后和显示之前调用 package com.example.chenshuai.excise; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View;

cocos3.2中如何创建一个场景

1.可以将一些比较通用的东西放到Common.h中,这是一个.h文件,必须手动添加,且保证在classes目录里 #ifndef __COMMON_H__ #define __COMMON_H__ #include "cocos2d.h" USING_NS_CC; #define winSize Director::getInstance()->getWinSize() #define CCLog cocos2d::log #endif 2.创建一个场景

Three.js入门篇(一)创建一个场景

上一面讲述了向场景中添加物体对象.这一篇准备把每个功能点细细的讲述一遍,一方面是为了加深自己的理解.另一方面希望能够 帮助到有需要的人. 一.在学习WEBGL的时候,你应该先了解要创建一个WebGL程序需要哪些步骤.就跟弄梅菜扣肉一样,需要哪些步骤. 初始化WebGL绘图上下文 初始化着色器程序 建立模型和数据缓存 完成绘制和动画 这是一个面向过程编程.然而three.js不一样,是一个面向对象编程.主要构建三个对象 scene(场景) camera(相机) renderer(渲染器).. 这三

最近项目中遇到了一个场景,其实很常见,就是定时获取接口刷新数据。那么问题来了,假设我设置的定时时间为1s,而数据接口返回大于1s,应该用同步阻塞还是异步?

初识setTimeout 与 setInterval 先来简单认识,后面我们试试用setTimeout 实现 setInterval 的功能 setTimeout 延迟一段时间执行一次 (Only one) 1 2 3 4 5 setTimeout(function, milliseconds, param1, param2, ...) clearTimeout() // 阻止定时器运行 e.g. setTimeout(function(){ alert("Hello"); }, 30

通过Static 字段来维护状态是不是一个好主意

Static是申明静态字段.静态方法或者静态类的修饰符.使用Static申明的字段属于类型本身而不属于任何字段,声明的类也具有一些特别特性,比如不能实例化,不能继承等.用通俗化的语言来说,static字段即使创建多个类型实例也只会声明一次,应为他属于类型.它在所有类实例之间皆可访问.可以认为静态字段是类型的全局变量. 我会在一些场景下使用static字段,出现次数最多的就是作为函数/方法修饰符或者简单的单例模式.我个人认为,static函数类似于C函数(method),而一般中function称