日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发基础02. 传统线程技术中的定时器技术

發布時間:2024/4/17 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发基础02. 传统线程技术中的定时器技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

傳統線程技術中有個定時器,定時器的類是Timer,我們使用定時器的目的就是給它安排任務,讓它在指定的時間完成任務。所以先來看一下Timer類中的方法(主要看常用的TimerTask()方法):

前面兩個是在指定延遲后執行或者重復執行,后面兩個是在指定時間執行或者重復執行。我們以前兩個為例來研究一下定時器的使用。
先寫一個簡單的使用定時器的demo,然后慢慢引申。

public class TraditionalTimer {public static void main(String[] args) {//簡單定時器的demonew Timer().schedule(new TimerTask() { @Overridepublic void run() {//實際中會扔一個對象進來,我們就可以在這里操作這個對象的所有方法了System.out.println("--boom--");//爆炸}}, 2000,3000); //打印秒鐘,一秒輸出一次,用來方便觀察的while(true) {System.out.println(new Date().getSeconds());try {Thread.sleep(1000);} catch(Exception e) {e.printStackTrace();}}} }

我們用匿名內部類來定義了一個TimerTask對象,需要重寫run()方法,然后運行這個程序,可以看出來第一次2秒鐘后打印“--boom--,后面每隔3秒打印一次。
我們也可以自己來實現上面這個重復執行,我們用定時器的“連環套”!也就是定時器中再套定時器,一個定時器任務執行完了,在任務的最后再裝一個定時器。那么我們需要先定義一個自己的定時器任務,在自己的定時器任務中再裝一個定時器,把自定義的定時器任務扔進去。然后我們開啟定時器的時候把自己定義的定時器任務扔進去即可。如下:

public class TraditionalTimer {public static void main(String[] args) {//自定義一個定時器任務class MyTimerTask extends TimerTask { @Overridepublic void run() {System.out.println("--boom--");//任務執行完再裝一個定時器,扔進自定義的定時器任務new Timer().schedule(new MyTimerTask(), 3000);}}new Timer().schedule(new MyTimerTask(), 2000);//外面開啟定時器while(true) {//打印秒鐘,一秒輸出一次System.out.println(new Date().getSeconds());try {Thread.sleep(1000);} catch(Exception e) {e.printStackTrace();}}} }

這樣的話,我們通過定時器的“連環套”很輕松的實現了連環爆炸。但是現在問題來了,上面提供的方法中重復執行都是每隔固定的時間,如果我想要隔2秒執行一次,再隔4秒執行一次,再隔2秒執行一次,再隔4秒執行一次……這該如何實現呢?
可以這樣,我們定義一個全局的私有成員變量來記錄爆炸次數,奇數的時候隔2秒炸,偶數的次數的話隔4秒炸,或者反過來也行,修改如下:

public class TraditionalTimer {private static int count = 0; //記錄爆炸的次數public static void main(String[] args) { class MyTimerTask extends TimerTask { @Overridepublic void run() {count = (count + 1) % 2; //結果只有0和1System.out.println("--boom--");new Timer().schedule(new MyTimerTask(), 2000+2000*count);//根據count結果設定新的定時時間}}new Timer().schedule(new MyTimerTask(), 2000);while(true) {//打印秒鐘,一秒輸出一次System.out.println(new Date().getSeconds());try {Thread.sleep(1000);} catch(Exception e) {e.printStackTrace();}}} }

這樣的話,我們就實現了自定義爆炸間隔了。上面這個是通過定義一個全局私有變量來實現,其實我們也可以這么干:不是要實現兩個不同時間間隔的連環炸么?我可以定義兩個定時器任務A和B,在A執行完開啟定時器,把B任務裝進去,B執行完開啟定時器把A裝進去,這樣也可以。如下:

public class TraditionalTimer {public static void main(String[] args) {new Timer().schedule(new MyTimerTaskA(), 2000);//A和B隨便開一個while(true) {//打印秒鐘,一秒輸出一次System.out.println(new Date().getSeconds());try {Thread.sleep(1000);} catch(Exception e) {e.printStackTrace();}}}} //自定義兩個定時器任務類,繼承TimerTask即可 class MyTimerTaskA extends TimerTask {@Overridepublic void run() {System.out.println("--boomA--");new Timer().schedule(new MyTimerTaskB(), 4000);} } class MyTimerTaskB extends TimerTask {@Overridepublic void run() {System.out.println("--boomB--");new Timer().schedule(new MyTimerTaskA(), 2000);} }

這樣就可以實現自定義時間間隔的連環炸了。傳統的定時器技術就總結這么多吧~
更多優質文章和資源,請關注公眾號:【程序員私房菜】。

轉載于:https://www.cnblogs.com/eson15/p/9824647.html

總結

以上是生活随笔為你收集整理的Java并发基础02. 传统线程技术中的定时器技术的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。