日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
面試突擊:如何使用線程池執(zhí)行定時任務?
  • 使用 schedule 方法執(zhí)行定時任務,只執(zhí)行一次定時任務。
  • 使用 scheduleAtFixedRate 方法執(zhí)行定時任務,執(zhí)行多次定時任務。
  • 使用 scheduleWithFixedDelay 方法執(zhí)行定時任務,執(zhí)行多次定時任務。

接下來我們看這 3 個方法的具體使用和區(qū)別。

1.schedule

schedule 方法只能執(zhí)行一次定時任務,它需要傳遞 3 個參數(shù):

  • 第 1 個參數(shù):傳遞一個任務,Runnable 或 Callable 對象;
  • 第 2 個參數(shù):添加定時任務后,再過多久開始執(zhí)行定時任務;
  • 第 3 個參數(shù):時間單位,配合參數(shù) 2 一起使用。

下面我們創(chuàng)建一個 3 秒以后執(zhí)行的定時任務:

import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExample {
public static void main(String[] args) throws InterruptedException {
// 創(chuàng)建 ScheduledThreadPool 線程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
System.out.println("schedule 方法添加任務:" + LocalDateTime.now());
threadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("執(zhí)行 schedule 方法:" + LocalDateTime.now());
}
}, 3, TimeUnit.SECONDS); // 3s 之后執(zhí)行

// 以下代碼是給業(yè)務方法一個時間對照信息
TimeUnit.SECONDS.sleep(10); // 休眠 10s
System.out.println("當前時間:" + LocalDateTime.now());
}
}

以上程序的執(zhí)行結(jié)果如下圖所示:

從上述結(jié)果中可以看出,使用 schedule 方法只能執(zhí)行一次定時任務。

2.scheduleAtFixedRate

scheduleAtFixedRate 方法可以執(zhí)行多次定時任務,此方法需要 4 個參數(shù):

  • 第 1 個參數(shù):傳遞一個任務,Runnable 或 Callable 對象;
  • 第 2 個參數(shù):添加定時任務后,再過多久開始執(zhí)行定時任務;
  • 第 3 個參數(shù):定時任務執(zhí)行的時間間隔;
  • 第 4 個參數(shù):時間單位,配合參數(shù) 2 和參數(shù) 3 一起使用。

下面我們創(chuàng)建一個 3 秒后執(zhí)行的定時任務,每個定時任務執(zhí)行的時間間隔為 2 秒,實現(xiàn)代碼如下:

import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExample {
public static void main(String[] args) throws InterruptedException {
// 創(chuàng)建 ScheduledThreadPool 線程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
System.out.println("scheduleAtFixedRate 方法添加任務:" + LocalDateTime.now());
threadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("執(zhí)行 scheduleAtFixedRate 方法:" + LocalDateTime.now());
// 休眠 2s
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},
3L, // 3s 后開始執(zhí)行定時任務
2L, // 定時任務的執(zhí)行間隔為 2s
TimeUnit.SECONDS); // 描述上面兩個參數(shù)的時間單位
}
}

以上程序的執(zhí)行結(jié)果如下圖所示:

從上述結(jié)果可以看出,當任務添加成功之后,3s 后開始執(zhí)行第一個定時任務,之后每隔 2s 執(zhí)行一次定時任務。

3.scheduleWithFixedDelay

scheduleWithFixedDelay 方法的使用和 scheduleAtFixedRate 類似,但執(zhí)行效果完全不同,這個很容易理解如果效果一樣就不用創(chuàng)建兩個方法了。scheduleWithFixedDelay 方法是在方法執(zhí)行完成之后,再隔 N 秒執(zhí)行下一個定時任務,和 scheduleAtFixedRate 的固定時間執(zhí)行不同,scheduleWithFixedDelay 方法的執(zhí)行受定時任務執(zhí)行的時長影響,比如以下代碼:

import java.time.LocalDateTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledThreadPoolExample {
public static void main(String[] args) throws InterruptedException {
// 創(chuàng)建 ScheduledThreadPool 線程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
System.out.println("scheduleWithFixedDelay 方法添加任務:" + LocalDateTime.now());
threadPool.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("執(zhí)行 scheduleWithFixedDelay 方法:" + LocalDateTime.now());
// 休眠 2s
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},
3L, // 3s 后開始執(zhí)行定時任務
2L, // 定時任務執(zhí)行完 2s 之后,再執(zhí)行下一個定時任務
TimeUnit.SECONDS); // 描述上面兩個參數(shù)的時間單位
}
}

以上程序的執(zhí)行結(jié)果如下圖所示:

從上述結(jié)果可以看出,定時任務在 3s 之后開始執(zhí)行,以后每隔 4s 執(zhí)行一次,這 4s 包含了,定時任務執(zhí)行花費的 2s,加上每隔 2s 執(zhí)行一次的時間間隔,也就是說 scheduleWithFixedDelay 是在任務執(zhí)行完 N 秒之后,再執(zhí)行下一次定時任務。

總結(jié)

線程池執(zhí)行定時任務的實現(xiàn)方法有 3 個:

使用 schedule 方法執(zhí)行定時任務,只執(zhí)行一次定時任務。

使用 scheduleAtFixedRate 方法執(zhí)行定時任務,執(zhí)行多次定時任務,它的執(zhí)行時間間隔是固定的,不受定時任務執(zhí)行時長影響(定時任務時間間隔 > 任務執(zhí)行時間)。

使用 scheduleWithFixedDelay 方法執(zhí)行定時任務,執(zhí)行多次定時任務,它是在定時任務執(zhí)行完之后,再隔 N 秒開始執(zhí)行下一次定時任務,它的執(zhí)行時間受定時任務執(zhí)行時長影響。


當前題目:面試突擊:如何使用線程池執(zhí)行定時任務?
本文網(wǎng)址:http://www.dlmjj.cn/article/djihdhc.html