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

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

没有恢复中断状态时,在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)

 





 

相关文章
|
23天前
|
数据采集 传感器
定时中断基本结构
【10月更文挑战第21天】定时中断是在微控制器或计算机系统中,按预设时间间隔自动触发中断请求的机制。它由定时器硬件模块(含计数器、时钟源、控制寄存器)、中断控制器(处理中断请求、设置优先级、中断屏蔽)和中断服务程序(保存现场、执行任务、恢复现场)组成,实现定时任务的精确执行。
|
3月前
|
存储 消息中间件 Kubernetes
在K8S中,什么是有状态应用和无状态应用?
在K8S中,什么是有状态应用和无状态应用?
|
存储 Kubernetes NoSQL
【K8S系列】第七讲:有状态服务 VS 无状态服务
【K8S系列】第七讲:有状态服务 VS 无状态服务
618 0
|
传感器 调度
什么是中断系统?
一、什么是中断系统 中断系统是计算机系统中的一种机制,它允许外部设备和程序请求处理器的注意力,以便进行特定的操作。当一个中断请求被触发时,处理器会暂停当前正在执行的程序,转而执行与中断相关的程序或服务例程。中断系统可以提高计算机系统的效率和响应速度,因为它允许处理器在等待某些事件的同时执行其他任务。常见的中断包括硬件中断(例如键盘输入、鼠标移动、网络数据传输等)和软件中断(例如操作系统调度、系统调用等)。 二、中断系统的特点 中断系统具有以下特点: 1. 实时性:中断系统能够及时响应外部设备的请求,提高计算机系统的响应速度和效率。 2. 可靠性:中断系统能够保证中断请求的可靠性,确保外部设备的
281 0
C中得到4号错误(中断),怎么办
C中得到4号错误(中断),怎么办
86 0
详解中断系统
本文针对地详解了中断系统
264 0
|
Java
线程的取消和中断
线程的取消和中断
139 0