java定时器写法_java定时器的写法是什么样?
定時器的用法是java核心基礎之一,很多特殊功能都需要用到定時器,下面一起來看看定時器是如何編寫的吧。
示例:一個具備周期性定時(毫秒級);單時刻定時(秒級);多時刻定時(秒級)。后兩個時間的設置必須符合“yyyy-MM-dd
HH:mm:ss”、“yyyy-MM-dd ”、“HH:mm:ss”、“HH:mm”、“yyyy-MM-dd HH”、“yyyy-MM-dd
HH:mm”格式的定時器
Java代碼//TimerTask代碼
import?java.text.SimpleDateFormat;
import?java.util.Date;
import?java.util.List;
public?abstract?class?TimerTask?implements?Runnable
{
private?long?period?=?-1;
private?String?time;
private?List??timeList;
private?boolean?isCancel?=?false;
private?boolean?isFormart?=?false;
public?long?getPeriod()
{
return?period;
}
public?void?setPeriod(long?period)
{
this.period?=?period;
}
public?void?setTime(String?time)
{
this.time?=?time;
}
public?String?getTime()
{
return?time;
}
public?List??getTimeList()
{
return?timeList;
}
public?void?setTimeList(List??timeList)
{
this.timeList?=?timeList;
}
public?void?cancel()
{
this.isCancel?=?true;
}
public?boolean?isCancel()
{
return?isCancel;
}
public?abstract?void?execute();
public?void?run()
{
//格式化傳入的日期或日期時間或時間參數
if?(!this.isFormart)
{
this.fomart();
}
//確保指定的運行點在一秒鐘內只運行一次
boolean?isRun?=?false;
//確保多個運行點中,每個運行點在一秒鐘內只運行一次
int?flag[]?=?null;
try
{
flag?=?new?int[this.timeList.size()];
}
catch?(Exception?e)
{}
SimpleDateFormat?sdf?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss");
//當沒有被取消時
while?(!isCancel)
{
String?dt?=?sdf.format(new?Date());
if?(this.period?>?0)
{
try
{
Thread.sleep(this.period);
}
catch?(Exception?e)
{}
this.execute();
}
else?if?(this.time?!=?null)
{
if?(this.time.indexOf("-")?>?0)
{
if?(this.time.equals(dt)?&&?!isRun)
{
isRun?=?true;
this.execute();
}
}
else
{
if?(this.time.equals(dt.substring(11))?&&?!isRun)
{
isRun?=?true;
this.execute();
}
}
}
else?if?(this.timeList?!=?null)
{
int?loopIndex?=?0;
for?(String?dateTime:?this.timeList)
{
if?(dateTime.indexOf("-")?>?0)
{
if?(dateTime.equals(dt)?&&?flag[loopIndex]?==?0)
{
this.execute();
flag[loopIndex]?=?1;
}
}
else
{
if?(dateTime.equals(dt.substring(11))?&&?flag[loopIndex]?==?0)
{
this.execute();
flag[loopIndex]?=?1;
}
}
++loopIndex;
}
}
}
}
private?void?fomart()
{
if?(!this.isFormart)
{
if?(this.time?!=?null)
{
this.time?=?this.format(this.time);
}
if?(this.timeList?!=?null)
{
for?(int?i?=?0;?i?
{
String?dateTime?=?this.timeList.get(i);
if?(dateTime?!=?null)
{
this.timeList.set(i,?format(dateTime));
}
}
}
}
else
{
this.isFormart?=?true;
}
}
private?String?format(String?datetime)
{
if?(datetime?!=?null)
{
//?是否含有減號
boolean?hasSubtrSign?=?datetime.contains("-");
//?是否含有冒號
boolean?hasColonSign?=?datetime.contains(":");
//?12-23?12:33
if?(hasSubtrSign?==?true?&&?hasColonSign?==?true)
{
datetime?=?DateUtil.formatToEnglish(datetime);
}
else?if?(hasSubtrSign?&&?hasColonSign?==?false)
{
datetime?=?DateUtil.formatToEnglish(datetime);
}
else?if?(hasSubtrSign?==?false?&&?hasColonSign)
{
datetime?=?DateUtil.formatToEnglish(datetime)
.substring(11);
}
}
return?datetime;
}
}
///
//Timer代碼
import?java.util.ArrayList;
public?class?Timer?extends?Thread
{
private?boolean?isStart?=?false;
private?boolean?isCannel?=?false;
ArrayList??tasks?=?new?ArrayList??();
public?Timer()
{}
public?void?cancel()
{
this.isCannel?=?true;
}
public?boolean?isCannel()
{
return?isCannel;
}
public?void?schedule(TimerTask?task,?long?period)
{
task.setPeriod(period);
//添加任務
this.addTask(task);
}
public?void?schedule(TimerTask?task,?long?delay,?long?period)
{
try
{
Thread.sleep(delay);
}
catch?(Exception?e)
{}
task.setPeriod(period);
//添加任務
this.addTask(task);
}
public?void?schedule(TimerTask?task,?String?time)
{
task.setTime(time);
//添加任務
this.addTask(task);
}
public?void?schedule(TimerTask?task,?long?delay,?String?time)
{
try
{
Thread.sleep(delay);
}
catch?(Exception?e)
{}
task.setTime(time);
//添加任務
this.addTask(task);
}
public?void?schedule(TimerTask?task,?java.util.List??timeList)
{
task.setTimeList(timeList);
//添加任務
this.addTask(task);
}
public?void?schedule(TimerTask?task,?long?delay,?java.util.List??timeList)
{
try
{
Thread.sleep(delay);
}
catch?(Exception?e)
{}
task.setTimeList(timeList);
//添加任務
this.addTask(task);
}
//添加任務
private?void?addTask(TimerTask?task)
{
boolean?isExist?=?false;
for?(TimerTaskBean?ttBean:?this.tasks)
{
if?(task.equals(ttBean.getTask()))
{
isExist?=?true;
break;
}
else
{
isExist?=?false;
}
}
if?(!isExist)
{
tasks.add(new?TimerTaskBean(task,?false));
}
//判斷定時器線程是否啟動
if?(!this.isStart)
{
this.start();
this.isStart?=?true;
}
}
public?void?run()
{
//?是否取消所有任務的定時功能
while?(!this.isCannel)
{
for?(int?i?=?0;?i?
{
TimerTaskBean?ttBean?=?tasks.get(i);
//判斷是否開始運行
if?(ttBean?!=?null?&&?!ttBean.isRun())
{
ttBean.setRun(true);
new?Thread(ttBean.getTask())
.start();
}
}
}
//當取消定時器時,取消所有任務
if?(this.isCannel)
{
for?(TimerTaskBean?ttBean:?tasks)
{
ttBean.getTask()
.cancel();
}
}
}
class?TimerTaskBean
{
public?TimerTaskBean()
{}
public?TimerTaskBean(TimerTask?task,?boolean?isRun)
{
this.task?=?task;
this.isRun?=?isRun;
}
private?boolean?isRun?=?false;
private?TimerTask?task?=?null;
public?boolean?isRun()
{
return?isRun;
}
public?void?setRun(boolean?isRun)
{
this.isRun?=?isRun;
}
public?TimerTask?getTask()
{
return?task;
}
public?void?setTask(TimerTask?task)
{
this.task?=?task;
}
}
}
//TimerTest代碼
import?java.util.ArrayList;
public?class?TimerTest
{
public?static?void?main(String[]?args)
{
Timer?t?=?new?Timer();
T1?t1?=?new?T1();
T2?t2?=?new?T2();
t.schedule(t1,?1000);
ArrayList??list?=?new?ArrayList??();
list.add("11:44:30");
list.add("11:44:31");
list.add("11:44:32");
list.add("11:44:33");
list.add("11:44:34");
list.add("11:44:35");
list.add("11:44:36");
list.add("11:44:37");
t.schedule(t1,?list);
try
{
Thread.sleep(1000?*?4);
}
catch?(Exception?e)
{}
t1.cancel();?//取消任務1,任務2線程停止
t.schedule(t2,?1000);
t.schedule(t2,?list);
try
{
Thread.sleep(1000?*?4);
}
catch?(Exception?e)
{}
t2.cancel();?//取消任務2,任務2線程停止
try
{
Thread.sleep(1000?*?4);
}
catch?(Exception?e)
{}
t.cancel();?//取消定時器,定時器線程停止
}
}
class?T1?extends?TimerTask
{
public?T1()
{}
public?void?execute()
{
System.out.println(11111111);
}
}
class?T2?extends?TimerTask
{
public?T2()
{}
public?void?execute()
{
System.out.println(22222222);
}
}
以上就是今天的全部內容,想知道更多詳細java基礎知識就請繼續關注我們了解詳情吧。
推薦閱讀:
總結
以上是生活随笔為你收集整理的java定时器写法_java定时器的写法是什么样?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 倡导就地过年 有城市将发放春节留岗红包:
- 下一篇: java 代码同步_Java同步代码块