註解定時器 原理暫且不談,定時器你當真會用?

2021-10-14 18:15:06 字數 4530 閱讀 6204

先來看一段面試中的場景

面試官: 我看你已經有一定工作年限了,那請問有沒有研究得比較深的一些技術棧呢?

你: 目前沒有太深的研究,暫時還主要是處於會使用的階段,我用過***,能幹活肯定是沒問題的!

面試官: 那定時器在專案中有用過嗎,平時都是怎麼使用的?

你: 當然有,我們是基於springboot做的定時器,使用很簡單,就是打上註解就行.

面試官: 既然你有使用過,那我們就聊一下springboot定時器使用層面的問題,不問深的,甚至分布式集群也暫時不考慮,就只考慮最簡單的單執行緒模型,那請問假如我定時任務是5秒執行一次,但是第乙個任務就執行了8秒,第二個會怎麼樣呢?你詳細說一下各種情況.

你: 這個…這個真沒有考慮過.

面試官: 我都還沒問原理,我這只是問最最基本的使用問題,要不今天先到這裡,你回去等通知吧.

spingboot的定時器我相信大家都會使用,即使不會使用的,隨便搜尋一下,相信都能在30分鐘內上手.但是其實spring的定時器有三種模式,分別是fixeddelaycronfixedrate.那這三種分別有什麼區別呢?我們來分別寫乙個springboot的定時器demo來體驗一下.

fixeddelay方式

1@component

2public class schedulehandle 個任務開始執行,執行時間為{}ms", i, sleeptime);16            thread.sleep(sleeptime);17            atomicinteger.getandincrement();18        }19    }20}

該方式最簡單,該方式的意思是,在上乙個任務執行完成之後,間隔3秒(因為@scheduled(fixeddelay = 3 * 1000))後,執行下乙個任務.這種是最容易理解的,所以放在第乙個來講.用乙個圖來表示的話,更容易理解.如下:

可以用輸出日誌驗證上述結論

12019-04-07 21:59:11.761  info 29372 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第0個任務開始執行,執行時間為8000ms

22019-04-07 21:59:22.772  info 29372 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第1個任務開始執行,執行時間為3000ms

32019-04-07 21:59:28.777  info 29372 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第2個任務開始執行,執行時間為6000ms

42019-04-07 21:59:37.783  info 29372 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第3個任務開始執行,執行時間為2000ms

52019-04-07 21:59:42.785  info 29372 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第4個任務開始執行,執行時間為2000ms

cron

1@scheduled(cron = "0/5 * * * * ? ")

2public void cron() throws exception 個任務開始執行,執行時間為{}ms", i, sleeptime);

7        thread.sleep(sleeptime);

8        atomicinteger.getandincrement();

9    }

10}

因為上方**配置如下:

1//每5s執行一次

2@scheduled(cron = "0/5 * * * * ? ")

因此你可以理解為5s就是乙個週期.這就相當於在宿舍洗澡,因為只有乙個洗澡位置(單執行緒),所以每次只能進去乙個人,然後捨長在門口,每5s看一下有沒有空位,有空位的話叫下乙個進去洗澡.

用一張圖來表示如下:

可以用輸出日誌驗證上述結論

12019-04-07 22:15:30.002  info 29385 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第0個任務開始執行,執行時間為8000ms

22019-04-07 22:15:40.001  info 29385 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第1個任務開始執行,執行時間為3000ms

32019-04-07 22:15:45.001  info 29385 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第2個任務開始執行,執行時間為6000ms

42019-04-07 22:15:55.001  info 29385 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第3個任務開始執行,執行時間為2000ms

52019-04-07 22:16:00.001  info 29385 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第4個任務開始執行,執行時間為2000ms

fixedrate

1@scheduled(fixedrate = 5 * 1000)

2public void fixedrate() throws exception 個任務開始執行,執行時間為{}ms", i, sleeptime);

7        thread.sleep(sleeptime);

8        atomicinteger.getandincrement();

9    }

10}

還是要拿洗澡的這個例子來說.但是該方式和cron的方式有很大不同

因上方**配置如下:

1@scheduled(fixedrate = 5 * 1000)

你可以理解為捨長預算每個同學洗澡的時間是5秒,但是第乙個同學進去洗澡,用了8秒.

用一張圖來表示如下:

可以用輸出日誌驗證上述結論

12019-04-07 22:18:44.814  info 29390 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第0個任務開始執行,執行時間為8000ms

22019-04-07 22:18:52.819  info 29390 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第1個任務開始執行,執行時間為3000ms

32019-04-07 22:18:55.824  info 29390 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第2個任務開始執行,執行時間為6000ms

42019-04-07 22:19:01.829  info 29390 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第3個任務開始執行,執行時間為2000ms

52019-04-07 22:19:04.816  info 29390 --- [pool-1-thread-1] com.toby.demo.job.schedulehandle         : 第4個任務開始執行,執行時間為2000ms

再談定時器

settimeout 和 setinterval兩個定時器都是接收兩個引數 第乙個引數可以是字串或函式 第二個引數是時間 單位是毫秒 如下圖 重點關注第乙個引數用法,如下所示 測試settimeout定時器 var test1 function var test2 function 寫法1 var ...

Mysql 檢視定時器 開啟定時器 設定定時器時間

1.檢視是否開啟evevt與開啟evevt。1.1 mysql evevt功能預設是關閉的,可以使用下面的語句來看evevt的狀態,如果是off或者0,表示是關閉的。show variables like sche 1.2 開啟evevt功能 setglobal event scheduler 1 ...

定時器 STM32定時器 基本定時器1

我是鼎!定時器時鐘一定要明確其中有哪些變數。上圖為stm407資料手冊摘出來的,可能看不清楚,其實就蘊含了幾點資訊。注意一點,我們看圖2,我們以apb1舉例,上面掛著很多的外設,包括usart1 adc 以及定時器,我們知道apb1上面最高時鐘頻率為84mhz,但是定時器的時鐘是要在此基礎上乘2,也...