Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们如何知道threadPoolExecutor已完成执行_Java_Multithreading_Threadpoolexecutor - Fatal编程技术网

Java 我们如何知道threadPoolExecutor已完成执行

Java 我们如何知道threadPoolExecutor已完成执行,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,我有一个向MQ发送消息的父线程,它为侦听MQ并将消息写入输出文件的工作线程管理ThreadPoolExecutor。我管理一个5号的线程池。所以当我运行我的程序时,我有5个带有消息的文件。在这里之前一切都很好。我现在需要在父线程中合并这5个文件 如何知道ThreadPoolExecutor已完成处理,以便开始合并文件 public class ParentThread { private MessageSender messageSender; private MessageRe

我有一个向MQ发送消息的父线程,它为侦听MQ并将消息写入输出文件的工作线程管理ThreadPoolExecutor。我管理一个5号的线程池。所以当我运行我的程序时,我有5个带有消息的文件。在这里之前一切都很好。我现在需要在父线程中合并这5个文件

如何知道ThreadPoolExecutor已完成处理,以便开始合并文件

public class ParentThread {
    private MessageSender messageSender;
    private MessageReciever messageReciever;
    private Queue jmsQueue;
    private Queue jmsReplyQueue;
    ExecutorService exec = Executors.newFixedThreadPool(5);

    public void sendMessages() {
        System.out.println("Sending");
        File xmlFile = new File("c:/filename.txt");
        List<String> lines = null;
        try {
            lines = FileUtils.readLines(xmlFile, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
        for (String line : lines){
            messageSender.sendMessage(line, this.jmsQueue, this.jmsReplyQueue);
        }
        int count = 0;
        while (count < 5) {
            messageSender.sendMessage("STOP", this.jmsQueue, this.jmsReplyQueue);
            count++;
        }

    }

    public void listenMessages() {
        long finishDate = new Date().getTime();
        for (int i = 0; i < 5; i++) {
            Worker worker = new Worker(i, this.messageReciever, this.jmsReplyQueue);
            exec.execute(worker);
        }
        exec.shutdown();

        if(exec.isTerminated()){ //PROBLEM is HERE. Control Never gets here.
            long currenttime = new Date().getTime() - finishDate;
            System.out.println("time taken: "+currenttime);
            mergeFiles();
        }
    }
}
我如何知道线程池何时完成处理,以便我可以执行其他清理工作

谢谢诸如此类的东西:

    exec.shutdown();

    // waiting for executors to finish their jobs
    while (!exec.awaitTermination(50, TimeUnit.MILLISECONDS));

    // perform clean up work

如果Worker类实现了Callable而不是Runnable,那么您将能够通过使用Future对象查看线程是否返回了某些结果(例如,布尔值,它将告诉您线程是否已完成执行)来查看线程何时完成

看看下面的“8.期货和可赎回债券”网站,它正好满足了您的需要:


编辑:因此,在所有的未来指示各自可调用的执行已完成后,可以安全地假设您的执行器已完成执行,并且可以手动关闭/终止。

您可以使用线程来监视ThreadPoolExecutor,就像这样

import java.util.concurrent.ThreadPoolExecutor;

public class MyMonitorThread implements Runnable {
     private ThreadPoolExecutor executor;

        private int seconds;

        private boolean run=true;

        public MyMonitorThread(ThreadPoolExecutor executor, int delay)
        {
            this.executor = executor;
            this.seconds=delay;
        }

        public void shutdown(){
            this.run=false;
        }

        @Override
        public void run()
        {
            while(run){
                    System.out.println(
                        String.format("[monitor] [%d/%d] Active: %d, Completed: %d, Task: %d, isShutdown: %s, isTerminated: %s",
                            this.executor.getPoolSize(),
                            this.executor.getCorePoolSize(),
                            this.executor.getActiveCount(),
                            this.executor.getCompletedTaskCount(),
                            this.executor.getTaskCount(),
                            this.executor.isShutdown(),
                            this.executor.isTerminated()));
                    try {
                        Thread.sleep(seconds*1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }

        }

}

MyMonitorThread monitor = new MyMonitorThread(executorPool, 3);
            Thread monitorThread = new Thread(monitor);
            monitorThread.start(); 
到ThreadPoolExecutor所在的类


它将每隔3秒显示threadpoolexecutors的状态

谢谢SilverHaze。正是我想要的。
MyMonitorThread monitor = new MyMonitorThread(executorPool, 3);
            Thread monitorThread = new Thread(monitor);
            monitorThread.start();