java實(shí)現(xiàn)定時(shí)器的四種方式
1. 使用Thread.sleep()方法
Thread.sleep()方法可以讓當(dāng)前線程暫停執(zhí)行一段時(shí)間,我們可以利用它來(lái)實(shí)現(xiàn)簡(jiǎn)單的定時(shí)器。
示例代碼:
```java
public class TimerDemo1 {
public static void main(String[] args) throws InterruptedException {
int count = 0;
while (true) {
System.out.println("定時(shí)器已經(jīng)運(yùn)行了 " + (++count) + " 秒");
Thread.sleep(1000); // 暫停1000毫秒,即1秒
}
}
}
```
該示例中我們使用了一個(gè)無(wú)限循環(huán),每次循環(huán)輸出當(dāng)前運(yùn)行的時(shí)間,并暫停1秒鐘后再繼續(xù)。
優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,易于理解。
缺點(diǎn):無(wú)法在定時(shí)器運(yùn)行過(guò)程中修改定時(shí)器的時(shí)間或停止定時(shí)器,不適合實(shí)現(xiàn)復(fù)雜的定時(shí)器邏輯。
2. 使用Timer類(lèi)
Timer類(lèi)是Java提供的一個(gè)簡(jiǎn)單的定時(shí)器工具,可以輕松實(shí)現(xiàn)定時(shí)器的開(kāi)啟、停止、暫停等操作。
示例代碼:
```java
import java.util.Timer;
import java.util.TimerTask;
public class TimerDemo2 {
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer();
int count = 0;
timer.schedule(new TimerTask() {
public void run() {
System.out.println("定時(shí)器已經(jīng)運(yùn)行了 " + (++count) + " 秒");
}
}, 1000, 1000);
Thread.sleep(5000);
timer.cancel();
}
}
```
該示例中我們使用了Timer類(lèi)實(shí)現(xiàn)定時(shí)器的功能,使用timer.schedule()方法開(kāi)啟定時(shí)器,可以設(shè)定初始延遲時(shí)間、定時(shí)器間隔時(shí)間,并通過(guò)timer.cancel()方法停止定時(shí)器。
優(yōu)點(diǎn):使用方便,適合實(shí)現(xiàn)一些簡(jiǎn)單的定時(shí)任務(wù)。
缺點(diǎn):無(wú)法在定時(shí)器運(yùn)行過(guò)程中修改定時(shí)器的時(shí)間或停止定時(shí)器,不支持并發(fā)操作。
3. 使用ScheduledExecutorService類(lèi)
ScheduledExecutorService類(lèi)是Java提供的用于定時(shí)執(zhí)行任務(wù)的工具類(lèi),可以設(shè)定定時(shí)器的初始延遲時(shí)間、間隔時(shí)間、并發(fā)量等參數(shù),支持更加靈活的定時(shí)器條件設(shè)定和停止。
示例代碼:
```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class TimerDemo3 {
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); // 開(kāi)啟一個(gè)線程池
int count = 0;
executor.scheduleAtFixedRate(() -> System.out.println("定時(shí)器已經(jīng)運(yùn)行了 " + (++count) + " 秒"), 1, 1, TimeUnit.SECONDS);
Thread.sleep(5000);
executor.shutdownNow();
}
}
```
該示例中我們使用了ScheduledExecutorService類(lèi)實(shí)現(xiàn)定時(shí)器的功能,在executor.scheduleAtFixedRate()方法中設(shè)定了初始延遲時(shí)間、定時(shí)器間隔時(shí)間,并通過(guò)executor.shutdownNow()方法停止定時(shí)器。
優(yōu)點(diǎn):靈活且方便,支持并發(fā)操作,適合實(shí)現(xiàn)一些復(fù)雜的定時(shí)任務(wù)。
缺點(diǎn):算法略有復(fù)雜,需要一定的背景知識(shí)。
4. 使用Quartz類(lèi)
Quartz是Java中一個(gè)強(qiáng)大的定時(shí)器框架,支持各種復(fù)雜的計(jì)劃和時(shí)間設(shè)定,適用于大型項(xiàng)目中的復(fù)雜定時(shí)任務(wù)。
示例代碼:
```java
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.CronScheduleBuilder.cronSchedule;
public class TimerDemo4 {
public static void main(String[] args) throws SchedulerException, InterruptedException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 獲取調(diào)度器
scheduler.start();
Job myJob = new Job() { // 自定義任務(wù)
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("調(diào)度器運(yùn)行中...");
}
};
scheduler.scheduleJob(
newJob(myJob.getClass()) // 設(shè)置任務(wù)
.withIdentity("myJob", "group1")
.build(),
newTrigger()
.withIdentity("myJobTrigger", "group1")
.withSchedule(
simpleSchedule() // 不重復(fù)執(zhí)行
.withIntervalInSeconds(1)
.withRepeatCount(0)
)
.build()
);
Thread.sleep(5000);
scheduler.shutdown();
}
}
```
該示例中我們使用了Quartz框架實(shí)現(xiàn)定時(shí)器,創(chuàng)建一個(gè)自定義的任務(wù),并調(diào)度它的執(zhí)行。我們可以通過(guò)修改Trigger實(shí)現(xiàn)更加復(fù)雜的時(shí)間調(diào)度設(shè)定。
優(yōu)點(diǎn):可以實(shí)現(xiàn)各種復(fù)雜的計(jì)劃和時(shí)間設(shè)定,適用于大型項(xiàng)目中的復(fù)雜定時(shí)任務(wù)。
缺點(diǎn):相對(duì)于其他方案來(lái)說(shuō),Quartz的學(xué)習(xí)和上手成本比較高。
-
JAVA
+關(guān)注
關(guān)注
19文章
2960瀏覽量
104563 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3241瀏覽量
114516
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論