成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:如何使用線程池執行定時任務?

開發 前端
scheduleWithFixedDelay 方法的使用和 scheduleAtFixedRate 類似,但執行效果完全不同,這個很容易理解如果效果一樣就不用創建兩個方法了。

在 Java 語言中,有兩個線程池可以執行定時任務:ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadScheduledExecutor 可以看做是 ScheduledThreadPool 的單線程版本,它的用法和 ScheduledThreadPool 是一樣的,所以本文重點來看 ScheduledThreadPool 線程池的使用。ScheduledThreadPool 執行定時任務的方法有以下 3 個:

  • 使用 schedule 方法執行定時任務,只執行一次定時任務。
  • 使用 scheduleAtFixedRate 方法執行定時任務,執行多次定時任務。
  • 使用 scheduleWithFixedDelay 方法執行定時任務,執行多次定時任務。

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

1.schedule

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

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

下面我們創建一個 3 秒以后執行的定時任務:

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 {
// 創建 ScheduledThreadPool 線程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
System.out.println("schedule 方法添加任務:" + LocalDateTime.now());
threadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("執行 schedule 方法:" + LocalDateTime.now());
}
}, 3, TimeUnit.SECONDS); // 3s 之后執行

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

以上程序的執行結果如下圖所示:

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

2.scheduleAtFixedRate

scheduleAtFixedRate 方法可以執行多次定時任務,此方法需要 4 個參數:

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

下面我們創建一個 3 秒后執行的定時任務,每個定時任務執行的時間間隔為 2 秒,實現代碼如下:

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 {
// 創建 ScheduledThreadPool 線程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
System.out.println("scheduleAtFixedRate 方法添加任務:" + LocalDateTime.now());
threadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("執行 scheduleAtFixedRate 方法:" + LocalDateTime.now());
// 休眠 2s
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},
3L, // 3s 后開始執行定時任務
2L, // 定時任務的執行間隔為 2s
TimeUnit.SECONDS); // 描述上面兩個參數的時間單位
}
}

以上程序的執行結果如下圖所示:

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

3.scheduleWithFixedDelay

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

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 {
// 創建 ScheduledThreadPool 線程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(10);
System.out.println("scheduleWithFixedDelay 方法添加任務:" + LocalDateTime.now());
threadPool.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("執行 scheduleWithFixedDelay 方法:" + LocalDateTime.now());
// 休眠 2s
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},
3L, // 3s 后開始執行定時任務
2L, // 定時任務執行完 2s 之后,再執行下一個定時任務
TimeUnit.SECONDS); // 描述上面兩個參數的時間單位
}
}

以上程序的執行結果如下圖所示:

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

總結

線程池執行定時任務的實現方法有 3 個:

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

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

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

責任編輯:武曉燕 來源: Java面試真題解析
相關推薦

2022-03-30 08:54:21

線程 Thread判斷線程池任務Java

2024-02-28 09:54:07

線程池配置

2022-03-14 07:32:06

線程池拒絕策略自定義

2020-12-10 07:00:38

編程線程池定時任務

2022-03-07 07:33:16

線程池Java語言

2022-02-28 07:01:22

線程中斷interrupt

2009-10-28 10:05:29

Ubuntucrontab定時任務

2022-03-23 08:51:21

線程池Java面試題

2022-03-02 07:36:37

池化技術Java線程池

2024-06-20 13:59:26

2024-09-09 15:09:30

2023-08-04 11:04:03

線程池項目開發

2024-11-04 16:01:01

2022-08-15 15:43:29

Linuxcron

2024-05-13 09:49:30

.NETQuartz庫Cron表達式

2024-11-27 13:25:24

Rust線程池線程

2022-03-21 07:40:08

線程池Executors方式

2023-08-08 08:35:28

web框架Hosting模塊

2012-02-07 13:31:14

SpringJava

2010-03-10 15:47:58

crontab定時任務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人激情视频免费在线观看 | 欧美伊人影院 | 国产999精品久久久 午夜天堂精品久久久久 | 性色在线 | 国产精久久久 | 欧美在线观看网站 | 98成人网| 四色永久| 国产精品一区在线观看 | 亚洲精品国产电影 | 精品国产乱码一区二区三区a | 激情一区二区三区 | 天天色天天色 | 国产精品二区三区在线观看 | 久久久久久久夜 | 成人在线视频看看 | 久草精品视频 | 国产在线观看不卡一区二区三区 | 亚洲午夜在线 | 久久在线看 | 四季久久免费一区二区三区四区 | 日韩精品中文字幕一区二区三区 | 999re5这里只有精品 | 国产激情91久久精品导航 | 国产日韩免费观看 | 日韩久久久久久久久久久 | 久久久久久久久久久久91 | 99精品欧美一区二区三区 | 国产精品18hdxxxⅹ在线 | 999国产视频 | 在线观看成人 | 亚洲精品视频在线 | 国产成人在线视频 | 久久免费精品 | 亚洲精品乱码久久久久久按摩观 | 欧美日韩不卡合集视频 | 日本一区视频在线观看 | 久久午夜精品福利一区二区 | 一区二区三区国产好 | 人人干人人干人人 | 亚洲精品4 |