欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java guava monitor監(jiān)視器線程的使用詳解

 更新時(shí)間:2021年11月02日 14:30:52   作者:劍客阿良_ALiang  
工作中的場(chǎng)景中是否存在類似這樣的場(chǎng)景,需要提交的線程在某個(gè)觸發(fā)條件下執(zhí)行。本文主要就是使用guava中的monitor來(lái)優(yōu)雅的實(shí)現(xiàn)帶監(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如何求交集、并集、差集

    Java如何求交集、并集、差集

    這篇文章主要介紹了Java如何求交集、并集、差集問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • springboot整合minio的超詳細(xì)教程

    springboot整合minio的超詳細(xì)教程

    在很多互聯(lián)網(wǎng)產(chǎn)品應(yīng)用中,都涉及到各種與文件存儲(chǔ)相關(guān)的業(yè)務(wù),隨著技術(shù)的發(fā)展,關(guān)于如何解決分布式文件存儲(chǔ)也有了比較成熟的方案,比如私有云部署下可以考慮fastdfs,阿里云對(duì)象存儲(chǔ)oss,七牛云等,本篇將為你介紹另一種文件存儲(chǔ)方式,即MinIO,需要的朋友可以參考下
    2023-12-12
  • Java之多個(gè)線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)

    Java之多個(gè)線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)

    這篇文章主要介紹了Java之多個(gè)線程順序循環(huán)執(zhí)行的幾種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot-RestTemplate實(shí)現(xiàn)調(diào)用第三方API的方式

    SpringBoot-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-12
  • 解決java錯(cuò)誤:不支持發(fā)行版本5

    解決java錯(cuò)誤:不支持發(fā)行版本5

    這篇文章主要給大家介紹了關(guān)于如何解決java錯(cuò)誤:不支持發(fā)行版本5的相關(guān)資料,發(fā)行版本5是Java5,已經(jīng)是十多年前的版本了,現(xiàn)在已經(jīng)不再被支持,需要的朋友可以參考下
    2023-07-07
  • Mybatis第三方PageHelper分頁(yè)插件的使用與原理

    Mybatis第三方PageHelper分頁(yè)插件的使用與原理

    提到插件相信大家都知道,插件的存在主要是用來(lái)改變或者增強(qiáng)原有的功能,MyBatis中也一樣,下面這篇文章主要給大家介紹了關(guān)于Mybatis第三方PageHelper分頁(yè)插件的使用與原理,需要的朋友可以參考下
    2022-02-02
  • Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下
    2017-04-04
  • 分隔List集合,按指定大小,將集合分成多個(gè)的方法

    分隔List集合,按指定大小,將集合分成多個(gè)的方法

    下面小編就為大家?guī)?lái)一篇分隔List集合,按指定大小,將集合分成多個(gè)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • 使用Spring底層組件實(shí)現(xiàn)Aware接口

    使用Spring底層組件實(shí)現(xiàn)Aware接口

    這篇文章主要介紹了使用Spring底層組件實(shí)現(xiàn)Aware接口,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Jenkins遠(yuǎn)程部署war包過(guò)程圖解

    Jenkins遠(yuǎn)程部署war包過(guò)程圖解

    這篇文章主要介紹了Jenkins遠(yuǎn)程部署war包過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評(píng)論