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

面試突擊:如何使用線程池執(zhí)行定時(shí)任務(wù)?

開(kāi)發(fā) 前端
scheduleWithFixedDelay 方法的使用和 scheduleAtFixedRate 類似,但執(zhí)行效果完全不同,這個(gè)很容易理解如果效果一樣就不用創(chuàng)建兩個(gè)方法了。

在 Java 語(yǔ)言中,有兩個(gè)線程池可以執(zhí)行定時(shí)任務(wù):ScheduledThreadPool 和 SingleThreadScheduledExecutor,其中 SingleThreadScheduledExecutor 可以看做是 ScheduledThreadPool 的單線程版本,它的用法和 ScheduledThreadPool 是一樣的,所以本文重點(diǎn)來(lái)看 ScheduledThreadPool 線程池的使用。ScheduledThreadPool 執(zhí)行定時(shí)任務(wù)的方法有以下 3 個(gè):

  • 使用 schedule 方法執(zhí)行定時(shí)任務(wù),只執(zhí)行一次定時(shí)任務(wù)。
  • 使用 scheduleAtFixedRate 方法執(zhí)行定時(shí)任務(wù),執(zhí)行多次定時(shí)任務(wù)。
  • 使用 scheduleWithFixedDelay 方法執(zhí)行定時(shí)任務(wù),執(zhí)行多次定時(shí)任務(wù)。

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

1.schedule

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

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

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

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 方法添加任務(wù):" + LocalDateTime.now());
threadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("執(zhí)行 schedule 方法:" + LocalDateTime.now());
}
}, 3, TimeUnit.SECONDS); // 3s 之后執(zhí)行

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

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

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

2.scheduleAtFixedRate

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

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

下面我們創(chuàng)建一個(gè) 3 秒后執(zhí)行的定時(shí)任務(wù),每個(gè)定時(shí)任務(wù)執(zhí)行的時(shí)間間隔為 2 秒,實(shí)現(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 方法添加任務(wù):" + 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 后開(kāi)始執(zhí)行定時(shí)任務(wù)
2L, // 定時(shí)任務(wù)的執(zhí)行間隔為 2s
TimeUnit.SECONDS); // 描述上面兩個(gè)參數(shù)的時(shí)間單位
}
}

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

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

3.scheduleWithFixedDelay

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

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 方法添加任務(wù):" + 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 后開(kāi)始執(zhí)行定時(shí)任務(wù)
2L, // 定時(shí)任務(wù)執(zhí)行完 2s 之后,再執(zhí)行下一個(gè)定時(shí)任務(wù)
TimeUnit.SECONDS); // 描述上面兩個(gè)參數(shù)的時(shí)間單位
}
}

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

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

總結(jié)

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

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

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

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

責(zé)任編輯:武曉燕 來(lái)源: Java面試真題解析
相關(guān)推薦

2022-03-30 08:54:21

線程 Thread判斷線程池任務(wù)Java

2024-02-28 09:54:07

線程池配置

2022-03-14 07:32:06

線程池拒絕策略自定義

2020-12-10 07:00:38

編程線程池定時(shí)任務(wù)

2022-03-07 07:33:16

線程池Java語(yǔ)言

2022-02-28 07:01:22

線程中斷interrupt

2009-10-28 10:05:29

Ubuntucrontab定時(shí)任務(wù)

2022-03-23 08:51:21

線程池Java面試題

2022-03-02 07:36:37

池化技術(shù)Java線程池

2024-06-20 13:59:26

2024-09-09 15:09:30

2023-08-04 11:04:03

線程池項(xiàng)目開(kāi)發(fā)

2024-11-04 16:01:01

2022-08-15 15:43:29

Linuxcron

2024-05-13 09:49:30

.NETQuartz庫(kù)Cron表達(dá)式

2024-11-27 13:25:24

Rust線程池線程

2022-03-21 07:40:08

線程池Executors方式

2012-02-07 13:31:14

SpringJava

2010-03-10 15:47:58

crontab定時(shí)任務(wù)

2023-12-08 14:42:17

Python庫(kù)開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品久久久免费 | 四季久久免费一区二区三区四区 | 一级免费在线视频 | 精品国产乱码久久久久久丨区2区 | 欧美成人精品一区二区男人看 | 国产精品久久久久久福利一牛影视 | 亚洲毛片 | 亚洲一视频 | 久久免费观看视频 | 91视频88av | 在线欧美亚洲 | 一级全黄少妇性色生活免费看 | 欧美日韩高清一区二区三区 | 国产精品69av | 国产一区h | 久久久精品一区二区三区 | 日本成人中文字幕 | 国产精品a免费一区久久电影 | 我想看一级黄色毛片 | h片在线免费看 | 欧美日韩综合一区 | 亚洲成人av在线播放 | h免费观看 | 日本韩国电影免费观看 | 久久99视频精品 | 免费影视在线观看 | 国产精品日韩欧美一区二区三区 | 亚洲视频在线看 | 欧美亚洲在线视频 | 亚洲国产欧美一区 | 日本一二三区在线观看 | 久久最新精品 | 91久久久久久久久久久 | 国产精品视频区 | 先锋av资源网 | 欧美最猛黑人xxxx黑人 | 涩在线| 午夜影院操| 黄色毛片黄色毛片 | 天天夜天天操 | 日韩在线免费电影 |