Member 13900997 Ответов: 0

Как я могу отображать результаты нескольких пингов одновременно в текстовых областях.


Привет, я работаю над настольным приложением для пинга нескольких IP-адресов одновременно. Это приложение предупреждает пользователей, когда IP-адрес недоступен. Результаты пингов должны отображаться на экземплярах текстовой области, по одному для каждого. Однако результат первого IP-адреса показывает, как он пингуется, в то время как другой пингуется в фоновом режиме и отображается только после того, как первый пингуется.

Что я уже пробовал:

При этом я создал потоки для каждого IP-адреса и преобразовал их в вызываемые объекты. Затем для вызова всех вызываемых объектов используется исполнитель threadpool. Затем для отображения результатов используется функция future.get ().

SwingWorker<Boolean, Integer> worker;
       worker = new SwingWorker<Boolean, Integer>(){
           @Override
           @SuppressWarnings("empty-statement")
           protected Boolean doInBackground() throws Exception {

               ArrayList<Thread> threadList = new ArrayList();

               if (ips.size() == 1){
                   try {
                       newPing.executor.execute(newPing.runSystemCommand(ips.get(0),inputArea,Runtime.getRuntime().exec("ping "+ips.get(0)+" -t")));

                   } catch (IOException | ClassNotFoundException | SQLException | InterruptedException | ExecutionException ex) {
                       Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
                   }
               }
               else{
                   for (String ip : ips) {
                       System.out.println(ip);
                       MultiView newView = new MultiView();
                       newView.setTitle("Pinging "+ip);
                       newView.setVisible(true);

                       class Ping extends Thread {
                           @Override
                           public void run(){
                               try {

                                   newPing.executor.execute(newPing.runSystemCommand(ip ,newView.mView,Runtime.getRuntime().exec("ping "+ip)));

                                   try{Thread.sleep(500);
                                   }catch(InterruptedException e){}
                               } catch (IOException | ClassNotFoundException | SQLException | InterruptedException | ExecutionException ex) {
                                   Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
                               }
                           }
                       }
                       Ping ping = new Ping();
                       threadList.add(ping);
                   }
                   List <Callable<Void>> callables = new ArrayList<Callable<Void>>();
                   threadList.forEach((Thread r) -> {
                       callables.add(toCallable(r));
                   });
                   pool.prestartAllCoreThreads();

                   try {
                       for (Iterator<Future<Void>> it = pool.invokeAll(callables).iterator(); it.hasNext();) {
                           Future<Void> futures = it.next();
                           futures.get();
                       }
                   } catch (InterruptedException ex) {
                       Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
                   }
               }
               return null;
           }
       };
   worker.execute();

0 Ответов