【发布时间】:2016-06-04 22:15:22
【问题描述】:
我有一个正在运行的线程队列,并希望在它执行时公开它的一些数据,以监控进程。
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();
}
}
【问题讨论】:
-
线程还是任务?它们是有区别的!从任何正在执行的任务中,您都可以使用
Thread.currentThread来访问正在执行它的线程并检索信息。您当然可以保留对所有已提交任务的引用以从中检索信息。 -
为什么会有一个正在运行的线程队列?你的意思是你有一个线程池?如果你想监控你的任务正在做什么,我建议你让任务定期更新一些关于他们正在做什么的信息,这样你就可以监控了。
-
哦,刚刚意识到,我可能误读了这个问题。您是否已经在使用 ExecutorService?我上面写的只有在这样的情况下才有意义。
-
是的,伙计们,对不起。我已经编辑了从 ExecutorService 到 ThreadPoolExecutor 的原始消息,但是 vektor 的编辑反转了它,我没有注意到。
-
你能详细说明一下你想在哪里公开吗?也许有一点代码?例如,如果您只想打印出承担任务的线程名称,您可以在
run方法中执行此操作,只需添加 using Thread.currentThread 并打印其名称和任务的标识符。
标签: java multithreading threadpoolexecutor java-threads