栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 带Monitor监视器线程,guava monitor的使用 | Java工具类

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 带Monitor监视器线程,guava monitor的使用 | Java工具类

目录

前言

Maven依赖

代码

总结


前言

工作中的场景中是否存在类似这样的场景,需要提交的线程在某个触发条件下执行。本文主要就是使用guava中的monitor来优雅的实现带监视器的线程。

Maven依赖
        
            com.google.guava
            guava
            31.0.1-jre
        

代码

不废话上代码。

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;


public class MonitorRunner implements Runnable {
  private T param;
  private Function condition;
  private Runnable runnable;
  private Monitor monitor;

  
  public MonitorRunner(T param, Function 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 setParam(T param) {
    this.param = param;
    return this;
  }

  public static void main(String[] args) {
    ExecutorService executorService =
        Executors.newFixedThreadPool(10, new CustomizableThreadFactory("MONITOR-"));
    MonitorRunner monitorRunner =
        new MonitorRunner<>(
            0,
            x -> x > 10,
            () -> {
              // todo 线程需要执行的内容
              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();
  }
}

代码说明

主要在构造对象的时候需要传递泛型的校验对象,以及断言和需要执行的Runable。

执行结果

总结

没啥好总结的,看场景使用吧。

如果本文对你有用,请点个赞吧,谢谢。

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/361226.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号