Threadpool Executor完成后如何给出消息?

时间:2016-10-31 06:46:55

标签: 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 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;
            }
        }

在此之后的最后片段: -

 private void sendToSearch(String address) throws Throwable {
            SearchingOperation operation = new SearchingOperation(new URL(address), i,
                    emailAddresses, level + 1);
            //operation.run();
            try {
                final Future handler = poolMainExecutor.submit(operation);

                try {
                    handler.get(Constant.TIME_OUT, TimeUnit.MILLISECONDS);
                } catch (TimeoutException e) {
                    e.printStackTrace();
                    handler.cancel(false);
                }
            } catch (Exception e) {
                //System.out.println("Time out for:" + address);
            } catch (Error error) {
                //System.out.println("Time out for:" + address);

            } finally {
            }
        }

3 个答案:

答案 0 :(得分:2)

实施Callable<Void>而不是Runnable并等待所有任务通过调用Future<Void>.get()来终止:

class SearchingOperation implements Callable<Void>
{
   public Void call() throws Exception
   {
      //same code as in run()
   }
}

//submit and wait until the task complete
Future<Void> future = poolMainExecutor.submit(new SearchingOperation()).get();

答案 1 :(得分:1)

使用ThreadPoolExecutor.awaitTermination()

  

阻止所有任务在关闭请求之后完成执行,或发生超时,或者当前线程被中断,以先发生者为准。

在代码中,您先创建ThreadPoolExecutor

ThreadPoolExecutor poolMainExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(Constant.NUM_OF_THREAD);

然后,您需要向其添加任务:

poolMainExecutor.execute(myTask);
poolMainExecutor.submit(myTask);

execute将不返回任何内容,而submit将返回Future个对象。任务必须实施RunnableCallable。例如,SearchingOperation的对象是一项任务。线程池将并行执行任务,但每个任务将由一个线程执行。这意味着要有效地使用NUM_OF_THREAD线程,您需要添加至少NUM_OF_THREAD个任务。

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

poolMainExecutor.shutdown();

最后,您需要等待所有任务完成。最简单的方法是致电

poolMainExecutor.awaitTermination(Integer.MAX_VALUE, TimeUnit.DAYS);

您应该在抛出异常之前调整等待任务完成的时间。

现在工作已完成,请通知用户。一种简单的方法是从JOptionPane中调用一个Dialog预设,例如:

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

它会弹出一个标题为“title”的小窗口,消息“message”,一个“信息”图标和一个关闭它的按钮。

答案 2 :(得分:0)

可以使用此代码。它将检查执行是否每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");