Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 当线程池执行器完成时,如何给出消息?_Java_Multithreading_Threadpool_Executorservice_Threadpoolexecutor - Fatal编程技术网

Java 当线程池执行器完成时,如何给出消息?

Java 当线程池执行器完成时,如何给出消息?,java,multithreading,threadpool,executorservice,threadpoolexecutor,Java,Multithreading,Threadpool,Executorservice,Threadpoolexecutor,我正在尝试在ThreadpoolExecutor完成执行时发出弹出警报消息。它正在搜索网站上的电子邮件地址,一旦搜索完成,我希望收到一条“已完成”的警告消息。这是我的帖子:- public class Constant { public static final int NUM_OF_THREAD = 60; public static final int TIME_OUT = 10000; } ThreadPoolExecutor poolM

我正在尝试在ThreadpoolExecutor完成执行时发出弹出警报消息。它正在搜索网站上的电子邮件地址,一旦搜索完成,我希望收到一条“已完成”的警告消息。这是我的帖子:-

public class Constant
    {
      public  static final int NUM_OF_THREAD = 60;
      public  static final int TIME_OUT = 10000;
    }
    ThreadPoolExecutor poolMainExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool
            (Constant.NUM_OF_THREAD);
这是我的搜索操作类:-

class SearchingOperation implements Runnable {

        URL urldata;
        int i;
        Set<String> emailAddresses;
        int level;

        SearchingOperation(URL urldata, int i, Set<String> emailAddresses, int level) {
            this.urldata = urldata;
            this.i = i;
            this.emailAddresses = emailAddresses;
            this.level = level;
            if (level != 1)
                model.setValueAt(urldata.getProtocol() + "://" + urldata.getHost() + "/contacts", i, 3);

        }

        public void run() {
            BufferedReader bufferreader1 = null;
            InputStreamReader emailReader = null;
            System.out.println(this.i + ":" + poolMainExecutor.getActiveCount() + ":" + level + ";" + urldata.toString());

            try {
                if (level < 1) {
                    String httpPatternString = "https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)";
                    String httpString = "";
                    BufferedReader bufferreaderHTTP = null;
                    InputStreamReader httpReader = null;
                    try {

                        httpReader = new InputStreamReader(urldata.openStream());
                        bufferreaderHTTP = new BufferedReader(httpReader
                        );
                        StringBuilder rawhttp = new StringBuilder();
                        while ((httpString = bufferreaderHTTP.readLine()) != null) {

                            rawhttp.append(httpString);

                        }
                        if (rawhttp.toString().isEmpty()) {
                            return;
                        }
                        List<String> urls = getURL(rawhttp.toString());
                        for (String url : urls) {
                            String fullUrl = getMatchRegex(url, httpPatternString);
                            if (fullUrl.isEmpty()) {
                                if (!url.startsWith("/")) {
                                    url = "/" + url;
                                }

                                String address = urldata.getProtocol() + "://" + urldata.getHost() + url;
                                fullUrl = getMatchRegex(address, httpPatternString);

                            }
                            if (!addressWorked.contains(fullUrl) && fullUrl.contains(urldata.getHost())) {
                                addressWorked.add(fullUrl);
                                sendToSearch(fullUrl);

                            }
                        }


                    } catch (Exception e) {
                        //System.out.println("652" + e.getMessage());
                        //e.printStackTrace();
                        return;
                    } finally {
                        try {
                            if (httpReader != null)
                                bufferreaderHTTP.close();
                        } catch (Exception e) {
                            // e.printStackTrace();
                        }
                        try {
                            if (httpReader != null)
                                httpReader.close();
                        } catch (Exception e) {
                            e.printStackTrace();

                        }

                    }
                }
                String someString = "";
                emailReader = new InputStreamReader(urldata.openStream());
                bufferreader1 = new BufferedReader(
                        emailReader);
                StringBuilder emailRaw = new StringBuilder();
                while ((someString = bufferreader1.readLine()) != null) {
                    if (someString.contains("@")) {
                        emailRaw.append(someString).append(";");
                    }
                }
                //Set<String> emailAddresses = new HashSet<String>();
                String emailAddress;
                //Pattern pattern = Pattern
                //.compile("\\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+\\b");
                Pattern
                        pattern = Pattern
                        .compile("\\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+\\b");

                Matcher matchs = pattern.matcher(emailRaw);
                while (matchs.find()) {
                    emailAddress = (emailRaw.substring(matchs.start(),
                            matchs.end()));
                    //  //System.out.println(emailAddress);
                    if (!emailAddresses.contains(emailAddress)) {
                        emailAddresses.add(emailAddress);
                        //  //System.out.println(emailAddress);
                        if (!foundItem.get(i)) {
                            table.setValueAt("Found", i, 4);
                            foundItem.set(i, true);
                        }

                        String emails = !emailAddresses.isEmpty() ? emailAddresses.toString() : "";
                        model.setValueAt(emails, i, 2);
                        model.setValueAt("", i, 3);
                    }
                }
            } catch (Exception e) {
                //System.out.println("687" + e.getMessage());
            } finally {
                try {
                    if (bufferreader1 != null)
                        bufferreader1.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    if (emailReader != null)
                        emailReader.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Thread.currentThread().interrupt();
                return;
            }
        }

可以使用此代码。它将每隔2.5秒检查执行是否完成

do {
        System.out.println("In Progress");
        try {
            Thread.sleep(2500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    } while (poolMainExecutor.getActiveCount() != 0);

    System.out.println("Completed");
实现
Callable
而不是
Runnable
,并通过调用
Future.get()等待所有任务终止:

class SearchingOperation实现可调用
{
public Void call()引发异常
{
//与run()中的代码相同
}
}
//提交并等待任务完成
Future Future=poolMainExecutor.submit(新搜索操作()).get();

使用
ThreadPoolExecutor.awaitTermination()

阻塞,直到所有任务在关闭请求后完成执行,或超时发生,或当前线程中断(以先发生的为准)

与在代码中一样,首先创建
ThreadPoolExecutor

ThreadPoolExecutor poolMainExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(Constant.NUM_OF_THREAD);
然后,您需要向其中添加任务:

poolMainExecutor.execute(myTask);
poolMainExecutor.submit(myTask);
execute
将不返回任何内容,而
submit
将返回一个
Future
对象。任务必须实现
Runnable
Callable
。例如,
SearchingOperation
的对象就是一个任务。线程池将并行执行任务,但每个任务将由一个线程执行。这意味着要有效地使用
NUM\u线程
线程,您需要至少添加
NUM\u线程
任务

(可选)完成所有作业后,关闭池。这将阻止提交新任务。它不会影响正在运行的任务

poolMainExecutor.shutdown();
最后,您需要等待所有任务完成。最简单的方法是打电话

poolMainExecutor.awaitTermination(Integer.MAX_VALUE, TimeUnit.DAYS);
在引发异常之前,您应该调整等待任务完成的时间量

现在工作已经完成,通知用户。一种简单的方法是从JOptionPane调用一个对话框预设,如:

JOptionPane.showMessageDialog(null, "message", "title", JOptionPane.INFORMATION_MESSAGE);

它将弹出一个小窗口,其中有标题“title”、消息“message”、一个“information”图标和一个用于关闭它的按钮。

这一行应该放在哪里?Future Future=poolMainExecutor.submit(新搜索操作()).get();创建
poolmain执行器后
哪一个?什么时候?@piegames我无法添加Future=poolMainExecutor.submit(新搜索操作()).get();它正在显示error@piegames如果对所有任务调用
Future.get()
Future
s,那么它会等待所有任务完成。Google Guava库有一个实现:您应该更清楚地知道您的执行者何时完成,或者您提交给它的任务是否完成。这是两件不同的事情。(奖励点1:任务的执行与此无关,无论您是下载内容还是打印Hello World,您的问题都是一样的,因此无需转储100行:-)。请注意:在多个线程中使用非并发DataStrcutions会导致错误,例如,
设置emailAddress
。不要在线程之间共享非并发数据结构。您只有一个任务(“poolMainExecutor.submit(operation);”)。这意味着调用操作.run();至少与使用ThreadPoolExecutor一样快,因为它只能使用您分配的60个线程中的一个。这是故意的、错误的还是问题的一部分?在将来的对象中,您可以使用isDone()方法检查它@那么,当发现所有电子邮件时,我如何执行所有任务并将消息显示为“已完成”?如果有可能等待或收到通知,请避免定期轮询(事实上两者都是一样的)。@Jobin谢谢!此while(poolMainExecutor.getActiveCount()!=0);帮助了我。但有一个问题是,当我使用此选项时,进程运行时不会显示其他进程。“完成”状态出现后,我就可以看到输出了。我想看到所有进程同时运行。@Jobin我得到了解决方案。我把它放在另一个线程中并运行它。@job在另一件事中,我想在单击按钮时开始搜索操作,我该怎么做?这很简单?你面临的问题是什么?太复杂了..无法理解兄弟!基本上,我想做的是当所有的电子邮件都从网站上提取出来时,我应该在完成后弹出一个窗口。请帮助我提供一个精确的解决方案,或者对我提供的上述代码进行更改。
poolMainExecutor.awaitTermination(Integer.MAX_VALUE, TimeUnit.DAYS);
JOptionPane.showMessageDialog(null, "message", "title", JOptionPane.INFORMATION_MESSAGE);