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;
/**
* 構造函數(shù)
*
* @param param 判斷參數(shù)
* @param condition 判定函數(shù)
* @param runnable 執(zhí)行內容
*/
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í)行的內容
System.out.println("今天天氣真好");
});
executorService.submit(monitorRunner);
while (monitorRunner.getParam() <= 10) {
monitorRunner.setParam(monitorRunner.getParam() + 1);
ThreadUtil.sleep(1000L);
System.out.println("當前Param的值:" + monitorRunner.getParam());
}
ThreadUtil.sleep(5000L);
executorService.shutdown();
}
}
代碼說明
主要在構造對象的時候需要傳遞泛型的校驗對象,以及斷言和需要執(zhí)行的Runable。
執(zhí)行結果

總結
沒啥好總結的,看場景使用吧。
如果本文對你有用,請點個贊吧,謝謝。

到此這篇關于Java guava monitor監(jiān)視器線程的使用詳解的文章就介紹到這了,更多相關Java 監(jiān)視器線程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中==符號與equals()的使用詳解(測試兩個變量是否相等)
下面小編就為大家?guī)硪黄狫ava中==符號與equals()的使用詳解(測試兩個變量是否相等)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
JPA中@JoinColumn的name和referencedColumnName屬性的區(qū)別及說明
這篇文章主要介紹了JPA中@JoinColumn的name和referencedColumnName屬性的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
如何對?Excel?表格中提取的數(shù)據(jù)進行批量更新
這篇文章主要介紹了如何對Excel表格中提取的數(shù)據(jù)進行批量更新操作,本文通過示例代碼介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-06-06
SpringBoot啟動報錯Failed to determine a suitable driver class
這篇文章主要介紹了SpringBoot啟動報錯Failed to determine a suitable driver class,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼
這篇文章主要介紹了IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼,本文通過代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08

