2015-10-29 2 views
1

Я действительно застрял в проблеме с потоками java и ProcessBuilder. Я не могу остановить поток, может быть, кто-то может помочь мне разобраться, почему он не работает. У меня есть два класса один класс GUI и один класс ThreadWorker, где есть настоящая нить и ProcessBuilder.Java can't stop Process Builder thread

GUI класс:

package minimum_gui; 

import java.awt.Color; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

    public class GUI 
    { 

     private JFrame jFrame; 


     ThreadWorker tw = new ThreadWorker("ThreadName"); 


     public GUI() 
     { 
      initialize(); 
     } 

     private void initialize() 
     { 
      jFrame = new JFrame(); 
      jFrame.setTitle("Example GUI"); 
      jFrame.setBounds(100,100,730,330); 
      jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      jFrame.setResizable(true); 
      jFrame.getContentPane().setLayout(null); 

      JPanel panel = new JPanel(); 
      panel.setBackground(Color.WHITE); 
      panel.setBounds(10, 11, 694, 281); 
      jFrame.getContentPane().add(panel); 
      panel.setLayout(null); 

      JButton btnStart = new JButton("Start"); 
      btnStart.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent arg0) { 
        tw.start(); 
       } 
      }); 
      btnStart.setBounds(28, 36, 89, 23); 
      panel.add(btnStart); 

      JButton btnStop = new JButton("Stop"); 
      btnStop.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        tw.stopIt(); 
       } 
      }); 
      btnStop.setBounds(28, 70, 89, 23); 
      panel.add(btnStop); 

     } 

     public static void main(String[] args) { 

      EventQueue.invokeLater(new Runnable() 
      { 
       public void run() 
       { 
        try 
        { 
         GUI window = new GUI(); 
         window.jFrame.setVisible(true); 
        } 
        catch (Exception e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      }); 

     } 
    } 

А класс ThreadWorker:

package minimum_gui; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.Arrays; 




    public class ThreadWorker implements Runnable 
    { 

     Thread thread = null; 
     String threadName; 

     public ThreadWorker(String name) 
     { 
      //thread.currentThread().setName(name); 
      this.threadName = name; 
     } 

     public synchronized void start() 
     { 
      if (thread == null) 
      { 
       thread = new Thread(this); 
       thread.start(); 
      } 
     } 

     public synchronized void stopIt() 
     { 
      if (thread != null) 
      { 
       thread = null; 
      } 
     } 

     public synchronized void interruptIt() 
     { 
      if (thread != null) 
       thread.interrupt(); 
     } 


     public void run() { 
      while (thread != null) 
      { 
       try { 
        String[] command = { "CMD", "/C","ping -n 20 google.com"}; 
        ProcessBuilder probuilder = new ProcessBuilder(command); 


        Process process = probuilder.start(); 
        final long start = System.currentTimeMillis(); 
        // Read out dir output 
        InputStream is = process.getInputStream(); 
        InputStreamReader isr = new InputStreamReader(is); 

        BufferedReader br = new BufferedReader(isr); 
        String line; 
        System.out.printf("Output of running %s is :\n", 
          Arrays.toString(command)); 

        try { 
         while ((line = br.readLine()) != null) { 
          System.out.println(line); 
         } 
        } catch (IOException e1) { 
         // TODO Auto-generated catch block 
         e1.printStackTrace(); 
        } 

       } catch (IOException e2) { 
        // TODO Auto-generated catch block 
        e2.printStackTrace(); 

       } 

      } 

     } 
    } 

ответ

1

Вы делаете пинги с 20 итераций ping -n 20 google.com

Печать результат на этих линиях:

while ((line = br.readLine()) != null) { 
    System.out.println(line); 
} 

Ну, это пока закончится только тогда, когда пинг будет завершен, и пока не будет проверки состояния потока (null или non-null).

Так что, если вы пытаетесь остановить работу, на внешнем, а

while (thread != null) 

Он остановится только тогда, когда пинг заканчивается, после 20 пингов.

Для немедленной остановки необходимо проверить состояние потока во внутренней части, а также, как

while ((line = br.readLine()) != null && thread != null) { 
    System.out.println(line); 
} 
+0

Ах ок, что имело смысл спасибо очень много! – Cali

+0

Ok testet это работает perfekt еще раз спасибо – Cali

+0

@oneprogrammer;) –