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

没有恢复中断状态时,在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-09-27 02:00:01

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

VC下做一个功能,双击列表控件,使得列表全屏显示,按Esc键恢复原来状态,怎么做?

问题描述 VC下做一个功能,双击列表控件,使得列表全屏显示,按Esc键恢复原来状态,怎么做? 使用List Control,双击它的时候能够变成全屏,按Esc键恢复原来状态 解决方案 是什么环境?如果是VB或者C#,你可以做一个窗口,不要边框和标题栏(controlbox FormBorderStyle),list control dock设置为fill响应keypress,如果是窗口,就切换到全屏的那个窗口,否则切换回来. 解决方案二: 处理db_click双击消息,然后MoveWindow调

ARM 中断状态和SVC状态的堆栈切换 (异常)【转】

转自:http://blog.csdn.net/edwardlulinux/article/details/9261393 版权声明:本文为博主原创文章,未经博主允许不得转载. ARM 中断状态和SVC状态的堆栈切换 (异常)   基础知识: Arm的寄存器使用规则以及寻址指令: R13  Sp     堆栈寄存器 R14  Lr     连接寄存器 R15  PC     程序计数器   多寄存器寻址: LDMIA R0!,{R1-R4} 执行以后的效果 R1  <--[R0] R2  <-

Android中断并重启一个Thread线程的简单方法

这里简单的总结下(大概思路,没调试,可能会有错!): MyThread.java pulbic class MyThread implemets Thread{ @overide public void run{ while(!Thread.interrputed()){ } } } xxx.java Thread mThread = new MyThread(); public static void startThread(){ mThread = new MyThread(); mThre

学习Flash制作经典动画《奇袭》中的一个场景

<奇袭>动画欣赏: 场景介绍: 前一场景2蛋把鬼子队长一脚踹入炮楼,如图4-244--247所示.这时2蛋仰头发现楼顶的鬼子将要跳下攻击他,所以2蛋回身转向刚才鬼子掉落的步枪处,用脚尖轻轻跳起步枪,飞身一个领空倒挂步枪如离弦之箭射向跳下的鬼子,一声惨叫后,鬼子抽出的身体慢慢僵硬下来,镜头拉开,2蛋依然蓄势待发,静场片刻,复活的鬼子队长怪叫一声冲出炮楼杀向2蛋,画面嘎然而至!这个场景是2蛋传奇的最后一个场景,由于整个作品的构思,我将在片尾推起一个高潮,并且嘎然而止给观众留下悬念.  图4-244

学习Flash制作《黑色故事》里的一个场景

前言 我们看到鸟儿在天上飞,花草随风飘动,水里鱼儿畅游,老者蹒跚踱步,孩子们嬉戏玩耍,,,,,所有这一切,我们的眼睛都准确无误地把它们捕捉,经过大脑的计算分析,之后我们发现这些物体都按照自己的规律运动着,它们的运动是那么的不同,只因为它们都有着自己的特性.如果眼睛看到这些物体不按自己的规律运动j就会向我们报告:"发现异常情况"--现实中你不可能看到鱼儿在天上飞----这是神话,老人们穿房越脊上窜下蹦-----那是武侠,让肥猪象猴子一样奔跑-----那猪必须疯狂减肥,一头驴突然对我说&q

拟定一个场景,需要做多条件查询,假设先选择一个条件,查询出内容后

问题描述 拟定一个场景,需要做多条件查询,假设先选择一个条件,查询出内容后 再选择一个条件,如何保证第二次查询是在第一次查询的基础上.用的ss2h框架 解决方案 不明白,你说的这个 可以在第二次查询的时候把第一次查询的条件参数带上,联查就可以额

java-设计一个场景,跪求奥特曼打小怪兽

问题描述 设计一个场景,跪求奥特曼打小怪兽 英雄攻击怪兽 1.设计一个英雄攻击怪兽的场景, 2.英雄攻击怪兽,经验提升,每100点经验升一级, 每升级一次,加10点攻击,每只怪兽的经验为250 3.英雄初始等级为1级,血量为1000,攻击为50, 防御为100 怪兽血量为300,攻击为20,防御为10 4.要求英雄攻击怪兽时,怪兽会掉血 英雄10点攻击,怪兽会掉20点血, 每收到20点攻击,怪兽会回5点血,怪兽每点防御, 抵消1点攻击 英雄收到怪物攻击, 怪兽10点攻击,英雄会掉20点血,每1点

求助蓝牙数据流读取问题,buffer的状态是一个迷

问题描述 求助蓝牙数据流读取问题,buffer的状态是一个迷 各位大大好,我是java小白+安卓小白,最近遇到一个头疼的问题: 我在创建蓝牙连接之后,开启新线程读取数据:(以下为线程类里的代码) Thread ReadThread=new Thread(){ //开辟缓冲区buffer byte[] buffer = new byte[1024]; int k=1; int num=0; public void run(){ try { while(count==0) { Log.e(TAG,

scene-cocos2d-x向一个场景中两次添加布同一个景

问题描述 cocos2d-x向一个场景中两次添加布同一个景 auto scene=Scene::create(); //创建一个场景类 auto layer=TilesMapSimpleLayer::create();//创建一个布景 scene->addChild(layer); //将场景添加进布景 auto layerMap=TilesMapSimpleLayer::create();//创建一个布景 layerMap->scene=scene; //TilesMapSimpleLaye