如何访问ThreadPoolExecutor内部正在运行的线程?

2023-11-23

我有一个正在运行的线程队列,并且希望在执行时公开其一些数据,以监视进程。

ThreadPoolExecutor提供对其队列的访问,我可以迭代这些对象来调用我的重写toString()方法,但这些只是等待执行的线程。

有没有办法访问当前正在运行的线程来调用我的方法?或者也许有更好的方法来完成这项任务?

为了更清楚地说明其目的,这里有一些总体思路的代码:

public class GetDataTask implements Runnable {
    private String pageNumber;
    private int dataBlocksParsed;
    private String source;
    private String dataType;


    public GetDataTask(String source, String dataType) {
        this.source = source;
        this.dataType = dataType;
    }

    @Override
    public void run() {
        //do stuff that affects pageNumber and dataBlocksParsed
    }

    @Override
    public String toString() {
        return "GetDataTask{" +
            "source=" + source +
            ", dataType=" + dataType +
            ", pageNumber=" + pageNumber +
            ", dataBlocksParsed=" + dataBlocksParsed +
            '}';
    }
}

和一个持有执行者的类:

public class DataParseManager {
    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 100, 20, TimeUnit.SECONDS, new ArrayBlockingQueue<>(300));

    public void addParseDataTask(String source, String dataType) {
        executor.execute(new GetDataTask(source, dataType));
    }

    // here's the method that I need
    public String getInfo() {
        StringBuilder info = new StringBuilder();
        //and here's the method that I'm missing - executor.getActiveThreads()
        for (Runnable r : executor.getActiveThreads()) {
            info.append(((GetDataTask) r).toString()).append('\n');
        }
        return info.append(executor.toString()).toString();
   }
}

像这样包装 Runnable 怎么样?

static class MonitorRunnable implements Runnable {

    static final List<Runnable> activeTasks = Collections.synchronizedList(new ArrayList<>());

    private final Runnable runnable;

    public MonitorRunnable(Runnable runnable) {
        this.runnable = runnable;
    }

    @Override
    public void run() {
        activeTasks.add(runnable);
        runnable.run();
        activeTasks.remove(runnable);
    }
}

and

public class DataParseManager {
    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(100, 100, 20, TimeUnit.SECONDS, new ArrayBlockingQueue<>(300));

    public void addParseDataTask(String source, String dataType) {
        executor.execute(new MonitorRunnable(new GetDataTask(source, dataType)));
    }

    // here's the method that I need
    public String getInfo() {
        StringBuilder info = new StringBuilder();
        //and here's the method that I'm missing - executor.getActiveThreads()
        synchronized (MonitorRunnable.activeTasks) {
            for (Runnable r : MonitorRunnable.activeTasks) {
                info.append(((GetDataTask) r).toString()).append('\n');
            }
        }
        return info.append(executor.toString()).toString();
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何访问ThreadPoolExecutor内部正在运行的线程? 的相关文章

随机推荐

  • 如何在异步方法中启动未等待的后台任务?

    我正在努力思考如何执行某些操作very 在异步方法的世界中长时间运行的后台处理 使用来自的词汇斯蒂芬 克利里的博客 我有兴趣启动 委托任务 after await 执行 承诺任务 我想在承诺的值可用时立即返回该值 并让委托任务在后台继续进行
  • javascript 提升:首先提升什么——变量还是函数?

    最近我对 javascript 提升行为感到困惑 现在我陷入了困境 所以 有两个例子 var alpha alpha var beta beta f beta var f function f1 console log beta funct
  • MariaDB CURRENT_TIMESTAMP 默认值

    我正在尝试为用户注册设置一个数据库 并希望有一列包含注册日期 默认情况下应该是当前时间 我尝试运行这个查询 CREATE TABLE users
  • jasper报告中的书写方法?

    我正在创建一个 jasper 报告 我想编写一个方法 该方法接受整数并执行一些处理并返回一个字符串 我不知道如何在 jasper 报告中编写方法 可以写吗 任何人都可以帮助我吗这 我使用的是iReport3 6 0 示例代码
  • ActionModel 的未定义方法“on”

    我收到以下错误 NoMethodError in Users new Showing app views users form new haml where line 7 raised undefined method on for
  • 如何在不使用create_function的情况下重写示例?

    当查看 PHP 时创建函数它说 如果您使用 PHP 5 3 0 或更新版本匿名函数应该使用 我想重新创建相同的功能create function但使用anonymous function 我不知道如何做 或者我是否正确地接近它 本质上 我如
  • 如何使用 JUnit 测试 Java 中的抽象类?

    我是使用 JUnit 进行 Java 测试的新手 我必须使用 Java 并且我想使用单元测试 我的问题是 我有一个带有一些抽象方法的抽象类 但有些方法并不是抽象的 如何使用 JUnit 测试此类 示例代码 非常简单 abstract cla
  • MongoDB:跨集合查询

    假设这样的设置 blogposts title Example slug example post tags foo bar title Example2 slug example2 tags foo news headline Test
  • CSRF 失败:CSRF 令牌丢失或不正确

    我正在使用 Django 1 7 和 django rest framework 我创建了一个 API 它返回一些 JSON 数据 将其放入我的settings py REST FRAMEWORK DEFAULT PERMISSION CL
  • 结构构造函数:“在控制权返回给调用者之前,必须完全分配字段。”

    这是我正在尝试编写的结构 public struct AttackTraits public AttackTraits double probability int damage float distance Probability pro
  • Android 材料设计

    新的Android Material Design是否支持旧版本的Android 例如3 0或2 1 如果支持的话会是什么样子 作为真正的材料设计还是只是旧设计 我即将使用材料设计主题更新我的应用程序 那么有人已经这样做了吗 就材料设计这一
  • 为什么 mac chrome 上的选择框不响应点击事件? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery 函数不适用于 Mac 上的 Chrome 但适用于 Win 7 上的 Chrome 和所有其他浏览器 我有一个选择选项列表 div class social option div
  • 带标题的 window.open

    我可以控制发送的 HTTP 标头吗window open 跨浏览器 如果没有 我可以以某种方式window open然后在弹出窗口中使用自定义标头发出我的请求的页面 我需要一些狡猾的技巧 我可以控制window open 跨浏览器 发送的H
  • 在 Android Marshmallow 中请求多个蓝牙权限

    我正在开发一个具有连接功能的应用程序 该应用程序连接到使用 SDK 23 进行编译的蓝牙设备 我在请求蓝牙的多个权限时遇到问题 这是我到目前为止所做的 Override public void onStart super onStart i
  • 这里如何去掉trace0呢?

    信息 trace0 始终显示在蓝线的悬停文本框旁边 如何删除它 为什么不在橙线上 Trace0到底是什么意思 library plotly fig lt plot ly fig lt fig gt add trace type scatte
  • C#更改框架错误

    我正在运行 Visual Studio 2010 我只是将项目的框架从 4 0 更改为 3 5 我删除了它要求我删除的引用 Microsoft Framework 然后尝试编译 我现在收到错误 错误 1 无法加载文件或 装配 系统 绘图 版
  • 海湾合作委员会优化?漏洞?及其对项目的实际意义

    我的问题分为三个部分 问题1考虑下面的代码 include
  • 从路径字符串中获取类似树的结构

    我已经被困了两天了 因为我对指针和递归不太坚定 我有一系列类似路径的结构 可以说 s string a b c a b g a d 具有这样的数据结构 type Node struct Name string json name Child
  • 如何在RecyclerView中选择和取消选择项目?如何仅在回收者视图中突出显示所选项目?

    Override public void onBindViewHolder final mainscreenspecializationadap MyViewHolder holder final int positionz this po
  • 如何访问ThreadPoolExecutor内部正在运行的线程?

    我有一个正在运行的线程队列 并且希望在执行时公开其一些数据 以监视进程 ThreadPoolExecutor提供对其队列的访问 我可以迭代这些对象来调用我的重写toString 方法 但这些只是等待执行的线程 有没有办法访问当前正在运行的线