需要恢復中斷狀態的一個場景
沒有恢復中斷狀態時,在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)
相關文章
- [譯] 狀態恢復入門教程
- PRemiere介面怎麼恢復?PR介面功能恢復預設狀態的技巧REM
- iOS UI狀態儲存和恢復(三)iOSUI
- 前端 | Vue 路由返回恢復頁面狀態前端Vue路由
- 恢復oracle的scott使用者初始狀態操作Oracle
- MySQL是如何做到可以恢復到任意一秒狀態的?MySql
- 聊聊 Kubernetes Pod or Namespace 卡在 Terminating 狀態的場景namespace
- 一個小技巧助您減少if語句的狀態判斷
- sqlsever處理資料庫的恢復掛起狀態SQL資料庫
- win10登錄檔恢復初始狀態的方法Win10
- Android Activity 重建之狀態儲存與恢復Android
- oracle關閉狀態刪除活動日誌報錯恢復(一)Oracle
- 結合具體場景,聊聊 React 的狀態管理方案React
- 12C PDB使用RMAN的4種完全恢復場景
- 以太坊 --- 交易池的特點 與 中斷恢復
- 從中國的山水畫談談遊戲場景設計該有的狀態遊戲
- 記前端狀態管理庫Akita中的一個坑前端
- [譯]使用MVI打造響應式APP(六):恢復狀態APP
- 一個 Pipeline 的使用場景
- 檢查Oracle災難恢復場景下的物理備庫XIOracle
- 如何恢復SSD NVME固態硬碟的資料恢復硬碟資料恢復
- vue v-for 列表更新導致 iframe 重新整理而狀態丟失的原因以及恢復狀態的方案Vue
- go需要泛型的場景Go泛型
- Go 需要泛型的場景Go泛型
- 說說HTTP 常見的狀態碼有哪些,適用場景?HTTP
- 判斷Nginx存活狀態Nginx
- win10怎麼恢復系統初始狀態 win10系統還原成原始狀態的方法Win10
- 螞蟻流場景狀態演進和最佳化
- 電商交易場景狀態機方案探索及應用
- SQLServer資料庫處於恢復掛起狀態的解決辦法SQLServer資料庫
- 從React Redux的實際業務場景來看有限狀態機ReactRedux
- 使用 ATX 判斷單選框選中狀態、開關狀態、圖示型別型別
- win10如何恢復電腦右下角的輸入法 win10如何恢復輸入法狀態列Win10
- jmeter 遇到的一個場景問題JMeter
- Jtti:SQLServer資料庫處於恢復掛起狀態的解決辦法JttiSQLServer資料庫
- 在Unity中快速搭建一個3A級別的場景Unity
- 資料庫恢復中需要大量儲存空間的原因HQ資料庫
- vim編輯過程中斷,恢復時出現警告
- 無論真實還是AI影片,「摩斯卡」都能重建恢復4D動態可渲染場景AI