ExecutorService状态监听器

时间:2016-04-19 12:21:14

标签: java multithreading executorservice

我目前正在构建一个应用程序,通过无线传感器网络轮询某些数据,然后处理它们以提取必要的信息。

我使用ExecutorService多次运行轮询任务(与网络中的节点一样多)。

GUI中将显示状态Label,将打印ExecutorService的状态。状态将是:

  • 轮询节点1(2,3,4,n)......
  • 终止线程......
  • 投票已完成

我发布了以下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() {
           ...
       }
    }
}

0 个答案:

没有答案