Java guava monitor監(jiān)視器線程的使用詳解
Maven依賴
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency>
代碼
不廢話上代碼。
package com.huyi.csdn.tools; import cn.hutool.core.thread.ThreadUtil; import com.google.common.util.concurrent.Monitor; import org.springframework.scheduling.concurrent.CustomizableThreadFactory; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Function; /** * @Program: csdn @ClassName: MonitorRunner @Author: huyi @Date: 2021-10-30 15:22 @Description: * 監(jiān)視器Runner @Version: V1.0 */ public class MonitorRunner<T> implements Runnable { private T param; private Function<T, Boolean> condition; private Runnable runnable; private Monitor monitor; /** * 構(gòu)造函數(shù) * * @param param 判斷參數(shù) * @param condition 判定函數(shù) * @param runnable 執(zhí)行內(nèi)容 */ public MonitorRunner(T param, Function<T, Boolean> condition, Runnable runnable) { this.param = param; this.condition = condition; this.runnable = runnable; monitor = new Monitor(); } @Override public void run() { System.out.println("線程開始"); Monitor.Guard guard = new Monitor.Guard(monitor) { @Override public boolean isSatisfied() { return condition.apply(param); } }; while (true) { if (monitor.enterIf(guard)) { try { runnable.run(); } finally { monitor.leave(); break; } } else { continue; } } } public T getParam() { return param; } public MonitorRunner<T> setParam(T param) { this.param = param; return this; } public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10, new CustomizableThreadFactory("MONITOR-")); MonitorRunner<Integer> monitorRunner = new MonitorRunner<>( 0, x -> x > 10, () -> { // todo 線程需要執(zhí)行的內(nèi)容 System.out.println("今天天氣真好"); }); executorService.submit(monitorRunner); while (monitorRunner.getParam() <= 10) { monitorRunner.setParam(monitorRunner.getParam() + 1); ThreadUtil.sleep(1000L); System.out.println("當(dāng)前Param的值:" + monitorRunner.getParam()); } ThreadUtil.sleep(5000L); executorService.shutdown(); } }
代碼說(shuō)明
主要在構(gòu)造對(duì)象的時(shí)候需要傳遞泛型的校驗(yàn)對(duì)象,以及斷言和需要執(zhí)行的Runable。
執(zhí)行結(jié)果
總結(jié)
沒啥好總結(jié)的,看場(chǎng)景使用吧。
如果本文對(duì)你有用,請(qǐng)點(diǎn)個(gè)贊吧,謝謝。
到此這篇關(guān)于Java guava monitor監(jiān)視器線程的使用詳解的文章就介紹到這了,更多相關(guān)Java 監(jiān)視器線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java之多個(gè)線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)
這篇文章主要介紹了Java之多個(gè)線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09SpringBoot-RestTemplate實(shí)現(xiàn)調(diào)用第三方API的方式
RestTemplate?是由?Spring?提供的一個(gè)?HTTP?請(qǐng)求工具,它提供了常見的REST請(qǐng)求方案的模版,例如?GET?請(qǐng)求、POST?請(qǐng)求、PUT?請(qǐng)求、DELETE?請(qǐng)求以及一些通用的請(qǐng)求執(zhí)行方法?exchange?以及?execute,下面看下SpringBoot?RestTemplate調(diào)用第三方API的方式2022-12-12Mybatis第三方PageHelper分頁(yè)插件的使用與原理
提到插件相信大家都知道,插件的存在主要是用來(lái)改變或者增強(qiáng)原有的功能,MyBatis中也一樣,下面這篇文章主要給大家介紹了關(guān)于Mybatis第三方PageHelper分頁(yè)插件的使用與原理,需要的朋友可以參考下2022-02-02Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-04-04使用Spring底層組件實(shí)現(xiàn)Aware接口
這篇文章主要介紹了使用Spring底層組件實(shí)現(xiàn)Aware接口,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Jenkins遠(yuǎn)程部署war包過(guò)程圖解
這篇文章主要介紹了Jenkins遠(yuǎn)程部署war包過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05