Java 无法停止 Process Builder 线程
Java can´t stop Process Builder thread
我真的被一个关于 java 线程和 ProcessBuilder
的问题困住了。
我无法停止线程,也许有人可以帮助我弄清楚为什么它不起作用。我有两个 classes,一个 GUI
class 和一个 ThreadWorker
class,其中实际线程和 ProcessBuilder
是。
GUI
class:
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 class:
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();
}
}
}
}
您正在执行 20 次迭代的命令 ping ping -n 20 google.com
在这些行上打印结果:
while ((line = br.readLine()) != null) {
System.out.println(line);
}
嗯,这个while只会在ping完成的时候结束,这个while不会校验线程状态(null或者non-null)
因此,如果您尝试停止工作,在外部
while (thread != null)
只有在 ping 完成时才会停止,在 20 次 ping 之后。
要立即停止你也需要检查里面的线程状态,比如
while ((line = br.readLine()) != null && thread != null) {
System.out.println(line);
}
我真的被一个关于 java 线程和 ProcessBuilder
的问题困住了。
我无法停止线程,也许有人可以帮助我弄清楚为什么它不起作用。我有两个 classes,一个 GUI
class 和一个 ThreadWorker
class,其中实际线程和 ProcessBuilder
是。
GUI
class:
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 class:
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();
}
}
}
}
您正在执行 20 次迭代的命令 ping ping -n 20 google.com
在这些行上打印结果:
while ((line = br.readLine()) != null) {
System.out.println(line);
}
嗯,这个while只会在ping完成的时候结束,这个while不会校验线程状态(null或者non-null)
因此,如果您尝试停止工作,在外部
while (thread != null)
只有在 ping 完成时才会停止,在 20 次 ping 之后。
要立即停止你也需要检查里面的线程状态,比如
while ((line = br.readLine()) != null && thread != null) {
System.out.println(line);
}