3

Я пытаюсь выдать всплывающее предупреждающее сообщение, когда мой ThreadpoolExecutor закончен. Он ищет адреса электронной почты с веб-сайтов, как только это будет сделано. Я хочу, чтобы предупреждающее сообщение было «Завершено». Вот моя тема: -Как передать сообщение, когда исполнитель проекта Threadpool завершен?

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); 

Вот мой Searching Операция класс: -

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\\.)?[[email protected]:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([[email protected]:%_\\+.~#?&//=]*)"; 
        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.-][email protected][a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+\\b"); 
       Pattern 
         pattern = Pattern 
         .compile("\\b[a-zA-Z0-9.-][email protected][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 { 
      } 
     } 
+0

В библиотеке Google Guava есть реализация для этого: https://github.com/google/guava/wiki/ListenableFutureExplained – Stephan

+1

Вам следует сделать более понятным, что вы хотите знать, когда ваш исполнитель будет завершен, или задание, которое вы отправили это есть. Это две разные вещи.(Бонусная точка 1: реализация задачи не имеет значения, если вы загружаете материал или печатаете Hello World, ваша проблема такая же, поэтому нет необходимости выгружать 100 строк :-). Обратите внимание: использование несовпадающих потоков данных внутри нескольких потоков - это рецепт ошибок, в том числе и ваш «Set адрес электронной почты». НЕ разделяйте несовпадающие структуры данных между потоками. – GPI

+0

У вас есть только одна задача («poolMainExecutor.submit (operation);»). Это означает, что вызов operation.run(); будет, по крайней мере, так же быстро, как использование ThreadPoolExecutor, поскольку он может использовать только один из 60 потоков, которые вы назначили. Это специально, ошибка или часть вопроса? – piegames

ответ

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"); 
+0

Избегайте опроса в обычные промежутки времени, если есть возможность подождать или получить уведомление (на самом деле это то же самое). – piegames

+0

@ Джобин Я отредактировал код, пожалуйста, проверьте его! –

+0

oh .. хороший я видел. – Jobin

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(); 
+0

Где я могу поместить эту строку? Будущее future = poolMainExecutor.submit (new SearchOperation()). Get(); –

+0

После создания 'poolMainExecutor' – ortis

+0

Отображается ошибка! –

1

Использование ThreadPoolExecutor.awaitTermination():

Blocks until all tasks have completed execution after a shutdown request, or the timeout occurs, or the current thread is interrupted, whichever happens first.

Как и в вашем коде, вы создаете ThreadPoolExecutor первая

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

Затем вам нужно добавить задачи к нему:

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

execute не вернет ничего, в то время как submit возвратит Future объект. Задачи должны реализовывать Runnable или Callable. Например, задача SearchingOperation. Пул потоков будет выполнять задачи параллельно, но каждая задача будет выполняться одним потоком. Это значит эффективно использовать NUM_OF_THREAD Темы, которые необходимо добавить не менее NUM_OF_THREAD Задачи.

(необязательно) После того, как у вас есть все рабочие места для работы, выключите свой бассейн. Это предотвратит отправку новых заданий. Это не повлияет на выполнение задач.

poolMainExecutor.shutdown(); 

В конце вы должны дождаться завершения всех Заданий. Самый простой способ по телефону

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

Вы должны регулировать количество времени, которое вы хотите ждать задачи закончить, прежде чем выбросить исключение.

Теперь, когда работа выполнена, уведомите пользователя. Простой способ вызвать один из диалоговых пресетов из JOptionPane, как:

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

Это всплывет небольшое окно с заголовком «названием», «сообщение» сообщения, значок «информационного» и кнопку закрой его.

+0

Слишком сложно .. не понять это брат! –

+0

Теперь я объяснил весь код. Надеюсь, что это лучше – piegames

+0

В основном, что я пытаюсь сделать, когда все электронные письма извлекаются с веб-сайта, я должен получить всплывающее окно как завершенное. Пожалуйста, помогите мне с точным решением или внесите изменения в приведенный выше код. –

 Смежные вопросы

  • Нет связанных вопросов^_^