У меня есть очередь запущенных потоков и вы хотите выставить некоторые из ее данных во время ее выполнения, чтобы отслеживать процесс.Как получить доступ к текущим потокам внутри ThreadPoolExecutor?
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', чтобы перейти к Thread, который его выполняет, и получить информацию. И вы можете, конечно, сохранить ссылки на все представленные задачи, чтобы извлекать из них информацию. – Fildor
Почему у вас есть очередь выполнения потоков? Вы имеете в виду, что у вас есть пул потоков? Если вы хотите следить за тем, что делают ваши задачи, я предлагаю вам периодически обновлять некоторые задания о том, что они делают, чтобы вы могли контролировать это. –
О, только что понял, я, вероятно, неправильно понял вопрос. Вы уже используете ExecutorService? То, что я написал выше, имеет смысл только тогда. – Fildor