久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

Java單機(jī)環(huán)境如何實(shí)現(xiàn)定時(shí)任務(wù)

今天小編給大家分享一下Java單機(jī)環(huán)境如何實(shí)現(xiàn)定時(shí)任務(wù)的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

成都創(chuàng)新互聯(lián)主營(yíng)歙縣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,歙縣h5小程序設(shè)計(jì)搭建,歙縣網(wǎng)站營(yíng)銷推廣歡迎歙縣等地區(qū)企業(yè)咨詢

定時(shí)任務(wù)框架

Java單機(jī)環(huán)境如何實(shí)現(xiàn)定時(shí)任務(wù)

TimeTask

從我們開始學(xué)習(xí)java開始,最先實(shí)現(xiàn)定時(shí)任務(wù)的時(shí)候都是采用TimeTask, Timer內(nèi)部使用TaskQueue的類存放定時(shí)任務(wù),它是一個(gè)基于最小堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列。TaskQueue會(huì)按照任務(wù)距離下一次執(zhí)行時(shí)間的大小將任務(wù)排序,保證在堆頂?shù)娜蝿?wù)最先執(zhí)行。

實(shí)例代碼:

 public static void main(String[] args)
    {
          TimerTask task = new TimerTask() {
              public void run() {
                  System.out.println("當(dāng)前時(shí)間: " + new Date() + "n" +
                          "線程名稱: " + Thread.currentThread().getName());
              }
          };
          Timer timer = new Timer("Timer");
          long delay = 5000L;
          timer.schedule(task, delay);
          System.out.println("當(dāng)前時(shí)間: " + new Date() + "n" +
                  "線程名稱: " + Thread.currentThread().getName());
    }

運(yùn)行結(jié)果:

當(dāng)前時(shí)間: Wed Apr 06 22:05:04 CST 2022n線程名稱: main
當(dāng)前時(shí)間: Wed Apr 06 22:05:09 CST 2022n線程名稱: Timer

從結(jié)果可以看出,5秒后執(zhí)行了定時(shí)任務(wù)。

缺點(diǎn):

  • TimeTask執(zhí)行任務(wù)只能串行執(zhí)行,一旦一個(gè)任務(wù)執(zhí)行的時(shí)間比較長(zhǎng)的話將會(huì)影響其他任務(wù)執(zhí)行

  • 執(zhí)行任務(wù)過程如果發(fā)生異常,任務(wù)會(huì)直接停止。

隨著時(shí)間的推移,java的技術(shù)也在不斷的更新,針對(duì)TimeTask的不足,ScheduledExecutorService出現(xiàn)替代了TimeTask。

ScheduledExecutorService

ScheduledExecutorService是一個(gè)接口,有多個(gè)實(shí)現(xiàn)類,比較常用的是ScheduledThreadPoolExecutor。而ScheduledThreadPoolExecutor本身就是一個(gè)線程池,其內(nèi)部使用 DelayQueue 作為任務(wù)隊(duì)列,并且支持任務(wù)并發(fā)執(zhí)行。

實(shí)例代碼:

 public static void main(String[] args) throws InterruptedException
   {
      ScheduledExecutorService executorService =
              Executors.newScheduledThreadPool(3);
      // 執(zhí)行任務(wù): 每 10秒執(zhí)行一次
      executorService.scheduleAtFixedRate(() -> {
          System.out.println("執(zhí)行任務(wù):" + new Date()+",線程名稱: " + Thread.currentThread().getName());
      }, 1, 10, TimeUnit.SECONDS);
    }

缺點(diǎn):

  • 盡量避免用Executors方式去創(chuàng)建線程池,因?yàn)閖dk自帶線程池內(nèi)部使用的的隊(duì)列的比較大,很容易出現(xiàn)OOM。

  • 定時(shí)任務(wù)是基于JVM單機(jī)內(nèi)存形式的,一旦重啟定時(shí)任務(wù)就消失了。

  • 無法支持cron表達(dá)式實(shí)現(xiàn)豐富的定時(shí)任務(wù)。

Spring Task

學(xué)習(xí)了Spring之后,開始使用了Spring 自帶的Task。Spring Framework 自帶定時(shí)任務(wù),提供了 cron 表達(dá)式來實(shí)現(xiàn)豐富定時(shí)任務(wù)配置。

實(shí)例代碼:

@EnableScheduling
@Component
public class SpringTask
{
    private Logger logger = LoggerFactory.getLogger(SpringTask.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat(
            "HH:mm:ss");
    /**
     * fixedRate:固定速率執(zhí)行。每5秒執(zhí)行一次。
     */
    @Scheduled(fixedRate = 5000)
    public void invokeTaskWithFixedRate()
    {
        logger.info("Fixed Rate Task :  Current Time  is  {}",
                dateFormat.format(new Date()));
    }
    /**
     * fixedDelay:固定延遲執(zhí)行。距離上一次調(diào)用成功后2秒才執(zhí)。
     */
    @Scheduled(fixedDelay = 2000)
    public void invokeTaskWithFixedDelay()
    {
        try
        {
            TimeUnit.SECONDS.sleep(3);
            logger.info("Fixed Delay Task : Current Time  is  {}",
                    dateFormat.format(new Date()));
        }
        catch (InterruptedException e)
        {
            logger.error("invoke task error",e);
        }
    }
    /**
     * initialDelay:初始延遲。任務(wù)的第一次執(zhí)行將延遲5秒,然后將以5秒的固定間隔執(zhí)行。
     */
    @Scheduled(initialDelay = 5000, fixedRate = 5000)
    public void invokeTaskWithInitialDelay()
    {
        logger.info("Task with Initial Delay : Current Time is  {}",
                dateFormat.format(new Date()));
    }
    /**
     * cron:使用Cron表達(dá)式,每隔5秒執(zhí)行一次
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void invokeTaskWithCronExpression()
    {
        logger.info("Task Cron Expression:  Current Time  is  {}",
                dateFormat.format(new Date()));
    }
}

執(zhí)行結(jié)果:

2022-04-06 23:06:20.945  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Task Cron Expression:  Current Time  is  23:06:20
2022-04-06 23:06:22.557  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Task with Initial Delay : Current Time is  23:06:22
2022-04-06 23:06:22.557  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Fixed Rate Task :  Current Time  is  23:06:22
2022-04-06 23:06:25.955  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Fixed Delay Task : Current Time  is  23:06:25
2022-04-06 23:06:25.955  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Task Cron Expression:  Current Time  is  23:06:25
2022-04-06 23:06:27.555  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Task with Initial Delay : Current Time is  23:06:27
2022-04-06 23:06:27.556  INFO 14604 --- [   scheduling-1] com.fw.task.SpringTask                   : Fixed Rate Task :  Current Time  is  23:06:27

@EnableScheduling需要開啟定時(shí)任務(wù),@Scheduled(cron = "0/5 * * * * ?")配置定時(shí)任務(wù)的規(guī)則。cron表達(dá)式支持豐富定時(shí)任務(wù)配置,不熟悉的的可以查看

優(yōu)點(diǎn):

使用簡(jiǎn)單方便,支持各種復(fù)雜的定時(shí)任務(wù)配置

缺點(diǎn):

  • 基于單機(jī)形式定時(shí)任務(wù),一旦重啟定時(shí)任務(wù)就消失了。

  • 定時(shí)任務(wù)默認(rèn)是單線程執(zhí)行任務(wù),如果需要并行執(zhí)行需要開啟@EnableAsync。

  • 沒有統(tǒng)一的圖形化任務(wù)調(diào)度的管理,無法控制定時(shí)任務(wù)

以上就是“Java單機(jī)環(huán)境如何實(shí)現(xiàn)定時(shí)任務(wù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享標(biāo)題:Java單機(jī)環(huán)境如何實(shí)現(xiàn)定時(shí)任務(wù)
當(dāng)前URL:http://sd-ha.com/article40/gpsiho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、網(wǎng)站維護(hù)、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司