Как я могу отображать результаты нескольких пингов одновременно в текстовых областях.
Привет, я работаю над настольным приложением для пинга нескольких 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();