Java併發和多執行緒3:執行緒排程和有條件取消排程
在第1篇中“併發框架基本示例”,提到了Executors和ThreadPool。
其中,還有個“定時排程”的方法,Executors.newScheduledThreadPool(10)。
// 可執行排程命令(定時+週期性)的執行緒池,擁有固定的執行緒數
// 重複執行,無窮盡
public static void scheduledThreadPool() {
int initialDelay = 10;
int period = 10;
Executor executor = Executors.newScheduledThreadPool(10);
ScheduledExecutorService scheduler = (ScheduledExecutorService) executor;
scheduler.scheduleAtFixedRate(task, initialDelay, period,
TimeUnit.SECONDS);
}
這段程式碼,會一直重複執行,是一種常見的場景。
但是,想到一種“只排程N次”的需求,看了下API,沒有提供。
就網上搜尋“Java 取消執行緒排程”,找到了1個問答,就研究了下。
程式碼示例的關鍵是,使用了執行緒安全的AtomicInteger和通用同步工具CountDownLatch。
核心邏輯就是,當超過了最大任務數N的時候,取消Future中的任務,countDownLatch中的計數器-1,變為0,“countDownLatch.await()”執行緒阻塞結束
countDownLatch.countDown();
關於CountDownLatch的進一步介紹,請參考第4篇。
package cn.fansunion.executorframework;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
//有條件地,取消排程
public class ConditionCancelSchedulerDemo {
public static Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Execute a task");
}
};
// 可執行排程命令(定時+週期性)的執行緒池,擁有固定的執行緒數
// 重複執行,無窮盡
public static void scheduledThreadPool() {
int initialDelay = 10;
int period = 10;
Executor executor = Executors.newScheduledThreadPool(10);
ScheduledExecutorService scheduler = (ScheduledExecutorService) executor;
scheduler.scheduleAtFixedRate(task, initialDelay, period,
TimeUnit.SECONDS);
}
public static void main(String[] args) throws Exception {
scheduledThreadPool();
conditionCancelScheduler();
}
private static void conditionCancelScheduler() throws InterruptedException {
final String jobID = "my_job_1";
final AtomicInteger count = new AtomicInteger(0);
final Map<String, Future> futures = new HashMap<>();
// 最多執行10個任務
final int maxTaskSize = 10;
// CountDownLatch的更多用法,請參考CountDownLatchDemo
final CountDownLatch countDownLatch = new CountDownLatch(1);
ScheduledExecutorService scheduler = Executors
.newSingleThreadScheduledExecutor();
Future future = scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println(count.getAndIncrement());
// 當排程執行,第maxTaskSize+1個任務的時候,取消Future中的任務。第11個任務
if (count.get() > maxTaskSize) {
System.out.println("a");
Future f = futures.get(jobID);
if (f != null) {
f.cancel(true);
}
// countDownLatch中的計數器-1,變為0
// “countDownLatch.await()”執行緒阻塞結束
countDownLatch.countDown();
}
}
}, 0, 1, TimeUnit.SECONDS);
futures.put(jobID, future);
countDownLatch.await();
scheduler.shutdown();
}
}
更多程式碼示例:
http://git.oschina.net/fansunion/Concurrent(逐步更新中)
參考資料:
java併發程式設計-Executor框架
http://www.iteye.com/topic/366591
有條件地終止 ScheduledExecutorService 中執行的定時任務
http://www.oschina.net/question/1158769_119659?sort=time
JDK API 文件
相關文章
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- Java執行緒的排程Java執行緒
- 多執行緒-執行緒排程及獲取和設定執行緒優先順序執行緒
- RxJava 和 RxAndroid 五(執行緒排程)RxJavaAndroid執行緒
- 程式執行緒排程方式執行緒
- 多執行緒脫離狀態 + 排程執行緒
- boost中asio網路庫多執行緒併發處理實現,以及asio在多執行緒模型中執行緒的排程情況和執行緒安全。執行緒模型
- 程序中的執行緒排程執行緒
- Java 併發和多執行緒(一) Java併發性和多執行緒介紹[轉]Java執行緒
- java多執行緒與併發 - Condition(條件)Java執行緒
- Java併發和多執行緒:序Java執行緒
- libgo原始碼分析之多執行緒協程管理和排程Go原始碼執行緒
- 多執行緒,執行緒類三種方式,執行緒排程,執行緒同步,死鎖,執行緒間的通訊,阻塞佇列,wait和sleep區別?執行緒佇列AI
- Nachos實驗實現執行緒id、限制執行緒數和更改排程演算法(按優先順序排程)執行緒演算法
- Java排程執行緒池ScheduledThreadPoolExecutor原始碼分析Java執行緒thread原始碼
- JAVA多執行緒和併發基礎Java執行緒
- OpenMP 中的執行緒任務排程執行緒
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- Spring 非同步執行緒池、排程任務執行緒池配置Spring非同步執行緒
- JAVA多執行緒併發Java執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- Java多執行緒和併發問題集Java執行緒
- 10、Java併發性和多執行緒-執行緒安全與不可變性Java執行緒
- 多執行緒(2)-執行緒同步條件變數執行緒變數
- Java多執行緒--併發和並行的區別Java執行緒並行
- 多執行緒和多執行緒同步執行緒
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- Java多執行緒/併發08、中斷執行緒 interrupt()Java執行緒
- Golang原始碼學習:排程邏輯(三)工作執行緒的執行流程與排程迴圈Golang原始碼執行緒
- java 多執行緒 併發 面試Java執行緒面試
- Java併發和多執行緒1:併發框架基本示例Java執行緒框架
- 【java】【多執行緒】獲取和設定執行緒名字、獲取執行緒物件(3)Java執行緒物件
- RxJava原始碼解析(二)—執行緒排程器SchedulerRxJava原始碼執行緒
- 多執行緒併發篇——如何停止執行緒執行緒
- Java高併發與多執行緒(三)-----執行緒的基本屬性和主要方法Java執行緒
- Java併發和多執行緒4:使用通用同步工具CountDownLatch實現執行緒等待Java執行緒CountDownLatch
- JavaEE進階知識學習----多執行緒JUC高階知識-5-執行緒池-Callable-執行緒排程Java執行緒
- Java多執行緒——執行緒Java執行緒