1. 程式人生 > >Timer的缺陷-不按定時時間執行【已入坑】

Timer的缺陷-不按定時時間執行【已入坑】

公司做專案,其中涉及到一個遊戲的業務邏輯,需要使用定時類去執行,在使用Timer的時候,發現總是出現奇怪的問題。

如下程式碼:

package com.yifeng.test22;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class RunLoter {
	private static Timer timer = new Timer();
	static public class Mytest1 extends TimerTask {

	

		@Override
		public void run() {
			// 這裡不幹別的只是睡覺
			try {
				System.out.println("Mytest1運行了,當前時間為" + new Date());
				Thread.sleep(20000);
				System.out.println("Mytest2運行了,當前時間為" + new Date());
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	static public class Mytest2 extends TimerTask {

		@Override
		public void run() {
			System.out.println("Mytest2運行了,當前時間為" + new Date());
		}

	}

	public static void main(String[] args) throws ParseException {
		Mytest1 mytest1=new Mytest1();
		Mytest2 mytest2=new Mytest2();
		timer.schedule(mytest1, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-11 09:49:40"));
		timer.schedule(mytest2, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-11 09:49:40"));
		
	}
}


我去,Test2 竟然沒按照時間執行,而是在test1執行結束後才去執行的。

究其原因:

這是因為Timer基本處理模型是單執行緒排程的任務佇列模型,Timer不停地接受排程任務,所有任務接受Timer排程後加入TaskQueue,TimerThread不停地去TaskQueue中取任務來執行.此種方式的不足之處為當某個任務執行時間較長,以致於超過了TaskQueue中下一個任務開始執行的時間,會影響整個任務執行的實時性。 


你可以試用scheduleAtFixedRate方法,它會讓任務儘量保證在規定的時間頻率執行,如:定的時間頻率是2s,因為系統繁忙,之後的2.5秒後任務才得以執行第二次,然後,Timer記下了這個延遲,並嘗試在下一個任務的時候彌補這個延遲,那麼,1.5秒後,任務將執行.

相關推薦

Timer缺陷-定時時間執行

公司做專案,其中涉及到一個遊戲的業務邏輯,需要使用定時類去執行,在使用Timer的時候,發現總是出現奇怪的問題。 如下程式碼: package com.yifeng.test22; import j

在linux下規定時間執行指令碼2017.2.27

首先 想crontab中加入定時執行的指令碼        1. 將當前crontab中的所有任務儲存到一個臨時檔案中  crontab -l >目錄/<臨時檔名>;        2.將要新增的指令碼放到<臨時檔名>            

SaltStack之遠程執行目標選擇匹配(六)

二次 配置 ast error entos argument 重啟 需要 是我 練習內容 Salt遠程執行中目標選擇常用的模式 1.通配符匹配 2.正則表達式匹配 3.List支持 4.Grains匹配 5.IP地址匹配 6.混合匹配 7.Node grou

ipad神ipad麥克風聽到聲音怎麽回事 微信QQ語音視頻對方都聽

說話 com 嘗試 alt 隱私 視頻 今天 聲音 解決方案 今天遇到了這個問題 說話聽不見,但是敲擊ipad,可以明顯的聽到擊打的聲音 siri也是可以聽到 上網上找,大多都是說恢復設置,重啟,隱私麥克風權限等解決方案 都是浪費感情 全部嘗試過了,依然沒有用。

bzoj 2784: [JLOI2012]時間流逝樹形期望dp

技術分享 int print include zoj space printf cpp struct 來自lyd課件 發現s和last(s),next(s)成樹結構,然後把式子化簡成kx+b的形式,做樹形dp即可 #include<iostream> #inc

PHP定時訪問api解決方案測試通過

背景介紹: 今天打算做一個數據統計功能,由於資料結構複雜,無法通過儲存過程來完成,所以只能開發PHP功能,定時呼叫該功能以完成資料統計。 方案1: 建立Windows計劃任務,定時執行.bat批處理檔案; 具體實施方法:先建立一個.bat檔案,例如,test.bat;然後在裡面寫上一

BZOJ P2753 [SCOI2012] 滑雪與時間膠囊最小生成樹

按要求建圖跑最小生成樹: #include <queue> #include <cmath> #include <cstdio> #include <cstring> #include <iostream&g

tomcat宕機自動重啟和每日定時啟動tomcat工具包系列

在專案後期維護中會遇到這樣的情況,tomcat在記憶體溢位的時候就出現宕機的情況和遇到長時間不響應,需要人工手動關閉和重啟服務,針對這樣的突發情況,希望程式能自動處理問題而不需要人工關於,所以才有了目前的需求。 一、設定tomcat定時啟動 1,首先將tomcat註

跨平臺的獲取時間win32和linux

工作需要,就寫了個時間戳獲取方法,主要針對Win32和linux,理論IOS只要使用code編譯出來的靜態庫即可[未嘗試] 直接code //標頭檔案 #include <time.h> #include <stdio.h> #ifdef WIN32

巨能react-native的大坑,定期更新

注:寫頁面時,當子元件是<Text>時一定不要固定父元件的寬高。 ----------------------------------------------------------------------------------------------

走過巨android studio對於jni呼叫及執行閃退無法載入庫的問題解決方案

相信很多小夥伴都在android開發中遇到呼叫jni的各種巨坑,因為我們不得不在很多地方用到第三方庫so檔案,然而第三方官方通常都只會給出ADT環境下的整合方式,而谷歌親兒子android studio預設採用的卻是gradle方式,與ADT編輯的方式大不相同,那再andorid studio中如何匯入so

R.layout 找到指定的id安卓開發

今天增加了一個新的安卓專案,剛開始配置佈局檔案就出了點小問題,經過幾次clean之後,報錯了,原來的R.layout.fragment_run是能找到的,但現在劃紅線,說找不到了: 但是開啟R.java,這個fragment_run卻是存在的: 這是怎麼回事?百度了一

常見踩USB調試安裝失敗(Installation failed with message INSTALL_CANCELED_BY_USER)

mes 需要 現在 com 錯誤 .cn www all 問題: 【參考】http://www.cnblogs.com/liushilin/p/6553918.html 問題:在USB安裝調試(小米手機),出現如下錯誤 解決:1.小米手機解決辦法見參考。登錄小米賬號

sql小在group by裏用select字段的別名?

報錯 spl tro use tin sql 主表 enc 方法 背景 -- 求每個用戶的擁有的產品數,其中userid需要簡單split出來 SELECT split (id, ‘-‘) [ 0 ] AS userid, c

搭建成功谷歌雲免費領1年300$ 10分鐘架設科學爬網

oom .com 來吧 borde 比較 風險 idt 分享圖片 amp 在YOUTUBE上發現的,不敢獨享,分享給福利吧夥伴們需要一張帶VISA或者mastercard的信用卡,和一個暫時能連上一會谷歌的網絡環境http://cloud.google.com/free我是

HDU 4069 Squiggly Sudoku舞蹈鏈樣例

space ios names sudoku clas class pac multipl 就是 建模思路跟之前的一樣,宮的話dfs搜索一下找聯通分量就行,好像也沒有更好的辦法,有的話請評論哈orz ——因為舞蹈鏈一般找到解以後就直接跳出了,所以ans數組就是ans不會再變

解決!spark程式報錯:java.lang.IndexOutOfBoundsException: toIndex = 9

該篇文章意於記錄報錯,也給遇到相同問題的小夥伴提供排錯思路!但是本人也沒有什麼好的解決方法,如果有,我會更新此文章 問題已經解決,請大家拉到最下面↓↓↓↓↓ 記錄下報錯: 寫了段spark程式碼,然後報錯了 2018-07-30 17:19:28,854 WARN [task-re

Python之寫兩次yaml.load(f),第二次打印出來內容是none

如以下程式碼:寫兩次yaml.load(f),第二次打印出來內容是none,什麼原因? import yaml, os # Create your tests here. base_dir = os.path.dirname(os.path.dirname(__file__)) file_

技巧Bessie Come Home回家

題目描述 現在是晚餐時間,而母牛們在外面分散的牧場中。 農民約翰按響了電鈴,所以她們開始向穀倉走去。 你的工作是要指出哪隻母牛會最先到達穀倉(在給出的測試資料中,總會有且只有一隻速度最快的母牛)。 在擠奶的時候(晚餐前),每隻母牛都在她自己的牧場上,一些牧場上可能沒有母牛。

前端填累加含小數點的資料:parseFloat、toFixed等

<script type="text/javascript"> //要求:累加含有兩位小數點的資料 var numbs = ['545.6','172.95','936.93','200','43.2','202.65','8573.9','171.92','72