2015-10-29 67 views
1

我真的陷入了与java线程和ProcessBuilder有关的问题。 我不能阻止线程,也许有人可以帮我弄清楚为什么它不起作用。我有两个班级GUI班和一个ThreadWorker班,其中实际的线程和ProcessBuilder是。Java无法停止Process Builder线程

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

打印在这些线路上的结果的ping命令:

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

嗯,这个while只会在ping完成时结束,并且在这段时间内没有关于线程状态(null或non-null)的验证。

所以,如果你尝试停止工作,在外部,而

while (thread != null) 

平的时候完成它只会停止,经过20坪。

要立即停止,您需要检查在内部,同时也执行绪状态,像

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

啊确定这道理非常感谢你! – Cali

+0

好的testet再次感谢 – Cali

+0

@oneprogrammer;) –