先來看一段面試中的場景
面試官: 我看你已經有一定工作年限了,那請問有沒有研究得比較深的一些技術棧呢?你: 目前沒有太深的研究,暫時還主要是處於會使用的階段,我用過***,能幹活肯定是沒問題的!
面試官: 那定時器在專案中有用過嗎,平時都是怎麼使用的?
你: 當然有,我們是基於springboot做的定時器,使用很簡單,就是打上註解就行.
面試官: 既然你有使用過,那我們就聊一下springboot定時器使用層面的問題,不問深的,甚至分布式集群也暫時不考慮,就只考慮最簡單的
單執行緒模型
,那請問假如我定時任務是5秒執行一次,但是第乙個任務就執行了8秒,第二個會怎麼樣呢?你詳細說一下各種情況.你: 這個…這個真沒有考慮過.
面試官: 我都還沒問原理,我這只是問最最基本的使用問題,要不今天先到這裡,你回去等通知吧.
spingboot的定時器我相信大家都會使用,即使不會使用的,隨便搜尋一下,相信都能在30分鐘內上手.但是其實spring的定時器有三種模式,分別是
fixeddelay
、cron
、fixedrate
.那這三種分別有什麼區別呢?我們來分別寫乙個springboot的定時器demo來體驗一下.fixeddelay方式該方式最簡單,該方式的意思是,在上乙個任務執行完成之後,間隔3秒(因為1@component
2public class schedulehandle 個任務開始執行,執行時間為{}ms", i, sleeptime);16 thread.sleep(sleeptime);17 atomicinteger.getandincrement();18 }19 }20}
@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}
因此你可以理解為5s就是乙個週期.這就相當於在宿舍洗澡,因為只有乙個洗澡位置(單執行緒),所以每次只能進去乙個人,然後捨長在門口,每5s看一下有沒有空位,有空位的話叫下乙個進去洗澡.1//每5s執行一次
2@scheduled(cron = "0/5 * * * * ? ")
用一張圖來表示如下:
可以用輸出日誌驗證上述結論
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
的方式有很大不同因上方**配置如下:
你可以理解為捨長預算每個同學洗澡的時間是5秒,但是第乙個同學進去洗澡,用了8秒.1@scheduled(fixedrate = 5 * 1000)
用一張圖來表示如下:
可以用輸出日誌驗證上述結論
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,也...