Maven依賴
1
2
3
4
5
|
< dependency > < groupId >com.google.guava</ groupId > < artifactId >guava</ artifactId > < version >31.0.1-jre</ version > </ dependency > |
代碼
不廢話上代碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
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(); } } |
代碼說明
主要在構(gòu)造對象的時(shí)候需要傳遞泛型的校驗(yàn)對象,以及斷言和需要執(zhí)行的Runable。
執(zhí)行結(jié)果
總結(jié)
沒啥好總結(jié)的,看場景使用吧。
如果本文對你有用,請點(diǎn)個(gè)贊吧,謝謝。
到此這篇關(guān)于Java guava monitor監(jiān)視器線程的使用詳解的文章就介紹到這了,更多相關(guān)Java 監(jiān)視器線程內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://huyi-aliang.blog.csdn.net/article/details/121056404