Java中的ScheduledThreadPoolExecutor類是java.util.concurrent包中定義的ThreadPoolExecutor類的子類。從它的名字可以清楚地看出,當我們想要安排任務重複運行或在給定的延遲之後運行一段時間時,此類非常有用。它創建一個fixed-sized線程池。所以在啟動時,需要給它 corePoolSize ( Thread pool 中的線程數)。
類層次結構:
構造函數:
- ScheduledThreadPoolExecutor(int corePoolSize):使用給定的池大小創建一個新的ScheduledThreadPoolExecutor對象。需要注意的是,它創建了一個 fixed-sized 線程池,因此一旦給出 corePoolSize,就無法增加線程池的大小。
- ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory):使用給定參數創建一個新的ScheduledThreadPoolExecutor對象。第一個參數是線程池的大小,第二個參數是ThreadFactory 對象,當ScheduledThreadPoolExecutor 創建新線程時使用該對象。
- ScheduledThreadPoolExecutor(int corePoolSize,RejectedExecutionHandler處理程序):使用給定的 corePoolSize(ThreadPool size) 和任務執行被拒絕時(當工作隊列已滿或執行被阻止時)使用的處理程序創建一個新的 ScheduledThreadPoolExecutor 對象。
- ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler 處理程序):使用給定參數創建一個新的ScheduledThreadPoolExecutor對象。
除了這些構造函數之外,還有另一種獲取 ScheduledThreadPoolExecutor 對象的方法。我們可以使用 Executors 類定義的 Executors.newScheduledThreadPool(int corePoolSize) 工廠方法。它返回一個ScheduledExecutorService對象,可以是type-casted到ScheduledThreadPoolExecutor對象。
ScheduledThreadPoolExecutor threadPool = (ScheduledThreadPoolExecutor)Executors.newScheduledThreadPool(4);
示例 1:
Java
// Java program to demonstrates ScheduleThreadPoolExecutor
// class
import java.util.*;
import java.util.concurrent.*;
import java.io.*;
class GFG {
public static void main(String[] args)
{
// Creating a ScheduledThreadPoolExecutor object
ScheduledThreadPoolExecutor threadPool
= new ScheduledThreadPoolExecutor(2);
// Creating two Runnable objects
Runnable task1 = new Command("task1");
Runnable task2 = new Command("task2");
// Printing the current time in seconds
System.out.println(
"Current time : "
+ Calendar.getInstance().get(Calendar.SECOND));
// Scheduling the first task which will execute
// after 2 seconds
threadPool.schedule(task1, 2, TimeUnit.SECONDS);
// Scheduling the second task which will execute
// after 5 seconds
threadPool.schedule(task2, 5, TimeUnit.SECONDS);
// Remember to shut sown the Thread Pool
threadPool.shutdown();
}
}
// Class that implements the Runnable interface
class Command implements Runnable {
String taskName;
public Command(String taskName)
{
this.taskName = taskName;
}
public void run()
{
System.out.println(
"Task name : " + this.taskName + " Current time: "
+ Calendar.getInstance().get(Calendar.SECOND));
}
}
輸出:
Current time : 51 Task name : task1 Current time : 53 Task name : task2 Current time : 56
這裏第一個任務在兩秒延遲後執行,第二個任務在五秒後執行。
示例 2:
Java
// Java program to demonstrates ScheduleThreadPoolExecutor
// class
import java.util.*;
import java.util.concurrent.*;
import java.io.*;
class GFG {
public static void main(String[] args)
{
// Creating a ScheduledThreadPoolExecutor object
ScheduledThreadPoolExecutor threadPool
= new ScheduledThreadPoolExecutor(2);
// Creating two Runnable objects
Runnable task1 = new Command("task1");
Runnable task2 = new Command("task2");
// Printing the current time in seconds
System.out.println(
"Current time:"
+ Calendar.getInstance().get(Calendar.SECOND));
// Scheduling the first task which will execute
// after 2 seconds and then repeats periodically with
// a period of 8 seconds
threadPool.scheduleAtFixedRate(task1, 2, 8,
TimeUnit.SECONDS);
// Scheduling the second task which will execute
// after 5 seconds and then there will be a delay of
// 5 seconds between the completion
// of one execution and the commencement of the next
// execution
threadPool.scheduleWithFixedDelay(task2, 5, 5,
TimeUnit.SECONDS);
// Wait for 30 seconds
try {
Thread.sleep(30000);
}
catch (Exception e) {
e.printStackTrace();
}
// Remember to shut sown the Thread Pool
threadPool.shutdown();
}
}
// Class that implements Runnable interface
class Command implements Runnable {
String taskName;
public Command(String taskName)
{
this.taskName = taskName;
}
public void run()
{
try {
System.out.println("Task name : "
+ this.taskName
+ " Current time : "
+ Calendar.getInstance().get(
Calendar.SECOND));
Thread.sleep(2000);
System.out.println("Executed : " + this.taskName
+ " Current time : "
+ Calendar.getInstance().get(
Calendar.SECOND));
}
catch (Exception e) {
e.printStackTrace();
}
}
}
輸出:
Current time:26 Task name : task1 Current time : 28 Executed : task1 Current time : 30 Task name : task2 Current time : 31 Executed : task2 Current time : 33 Task name : task1 Current time : 36 Executed : task1 Current time : 38 Task name : task2 Current time : 38 Executed : task2 Current time : 40 Task name : task1 Current time : 44 Task name : task2 Current time : 45 Executed : task1 Current time : 46 Executed : task2 Current time : 47 Task name : task1 Current time : 52 Task name : task2 Current time : 52 Executed : task1 Current time : 54 Executed : task2 Current time : 54
在這裏,第一個任務將在兩秒後執行,然後在八秒後定期重複。第二個任務將在五秒後執行,然後在一次執行完成和下一次執行開始之間會有五秒的延遲。
方法
METHOD |
DESCRIPTION |
---|---|
DecorateTask(Callable<V> 可調用,RunnableScheduledFuture<V> 任務) | 修改或替換用於執行可調用的任務。 |
decorateTask(Runnable 可運行,RunnableScheduledFuture<V> 任務) | 修改或替換用於執行可運行的任務。 |
execute(Runnable command) | 以零所需延遲執行命令。 |
getContinueExistingPeriodicTasksAfterShutdownPolicy( ) | 獲取即使該執行器已關閉也是否繼續執行現有定期任務的策略。 |
getExecuteExistingDelayedTasksAfterShutdownPolicy( ) | 獲取即使該執行器已關閉是否仍執行現有延遲任務的策略。 |
getQueue() | 返回此執行器使用的任務隊列。 |
getRemoveOnCancelPolicy() | 獲取有關取消的任務是否應在取消時立即從工作隊列中刪除的策略。 |
調度(Callable<V> 可調用,長延遲,TimeUnit 單元) | 創建並執行在給定延遲後啟用的ScheduledFuture。 |
schedule(Runnable command, long delay, TimeUnit unit) | 創建並執行 one-shot 操作,該操作在給定延遲後啟用。 |
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) | 創建並執行一個周期性操作,該操作首先在給定的延遲之後啟用,然後在給定的時間段內啟用。 |
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) | 創建並執行一個周期性操作,該操作在給定的延遲之後啟用,並隨後在一次執行終止和下一次執行開始之間具有給定的延遲。 |
setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value) | 設置即使該執行器已關閉也是否繼續執行現有定期任務的策略。 |
setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value) | 設置即使該執行器已關閉也是否執行現有延遲任務的策略。 |
setRemoveOnCancelPolicy() | 設置取消任務時是否應立即從工作隊列中刪除的策略。 |
shutdown() | 啟動有序關閉,執行先前提交的任務,但不會接受新的任務。 |
shutdownNow() | 嘗試停止所有正在執行的任務會停止正在等待的任務的處理,並返回正在等待執行的任務的列表。 |
提交(Callable<T> 任務) | 提交一個返回值的任務以供執行,並返回一個表示任務待處理結果的 future。 |
submit(Runnable task) | 提交一個可運行的任務以供執行,並返回代表該任務的 future。 |
submit(Runnable task, T result) | 提交一個可運行的任務以供執行,並返回代表該任務的 future。 |
相關用法
- Java ScheduledExecutorService用法及代碼示例
- Java Scanner findWithinHorizon()用法及代碼示例
- Java Scanner hasNext()用法及代碼示例
- Java Scanner next()用法及代碼示例
- Java Scanner remove()用法及代碼示例
- Java Scanner tokens()用法及代碼示例
- Java Scanner close()用法及代碼示例
- Java Scanner delimiter()用法及代碼示例
- Java Scanner findInLine()用法及代碼示例
- Java Scanner hasNextBigDecimal()用法及代碼示例
- Java Scanner hasNextBoolean()用法及代碼示例
- Java Scanner hasNextDouble()用法及代碼示例
- Java Scanner hasNextFloat()用法及代碼示例
- Java Scanner hasNextLine()用法及代碼示例
- Java Scanner hasNextShort()用法及代碼示例
- Java Scanner ioException()用法及代碼示例
- Java Scanner locale()用法及代碼示例
- Java Scanner match()用法及代碼示例
- Java Scanner nextBigDecimal()用法及代碼示例
- Java Scanner nextBigInteger()用法及代碼示例
- Java Scanner nextBoolean()用法及代碼示例
- Java Scanner nextByte()用法及代碼示例
- Java Scanner nextDouble()用法及代碼示例
- Java Scanner nextFloat()用法及代碼示例
- Java Scanner nextInt()用法及代碼示例
注:本文由純淨天空篩選整理自samufo大神的英文原創作品 ScheduledThreadPoolExecutor Class in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。