我目前正在构建一个应用程序,通过无线传感器网络轮询某些数据,然后处理它们以提取必要的信息。
我使用ExecutorService
多次运行轮询任务(与网络中的节点一样多)。
GUI中将显示状态Label
,将打印ExecutorService
的状态。状态将是:
我发布了以下ExecutorService
代码的片段。
我的问题是“轮询已完成”会打印在每个被停止但不在最后的线程中;而ExecutorService
正在关闭。这很明显,因为每个线程都与其他线程并行运行。
如果我错了,请纠正我。
threadPool.shutdown();
在所有正在运行的线程完成后立即执行。
我必须找到一种方法来检查/收听ExecutorService
的当前状态,并在进入shutdown
状态时打印状态标签。
任何建议都将受到高度赞赏。
public class ScannerThread extends Thread {
...
private static final int NUM_OF_THREADS = Nodes.COUNT;
private static final int UPDATE_INTERVAL = 200;
private ExecutorService threadPool;
public ScannerThread() {
threadPool = Executors.newFixedThreadPool(NUM_OF_THREADS);
...
setDaemon(true);
}
@Override
public void run() {
// poll data from each node in parallel, in a separate thread
for (Node node : Nodes.COUNT) {
...
PollingTask task = new PollingTask(node.getID());
threadPool. execute(task);
}
// request shutdown of the thread pool
threadPool.shutdown();
try {
// wait for all threads that are currently running
while (!threadPool.awaitTermination(UPDATE_INTERVAL, MILLISECONDS)) {
statusLabel.setText("Terminating threads...");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// polling completed
statusLabel.setText("Polling completed");
}
class PollingTask implements Runnable {
...
private String noteID;
PollingTask(String id) {
noteID = id;
...
}
@Override
public void run() {
...
}
}
}