运行while循环时杀死Java进程

时间:2016-09-29 12:22:46

标签: java

我有一个带有两个按钮的JFramePanel来运行这段代码:

public void runProc (){

        while(true){

            System.out.println("Running...");
            PrintWriter outputStream = null;

            try {
                outputStream = new PrintWriter (FILENAME);
            } 

            catch (FileNotFoundException e) {
                try {
                    Process failedToWriteFile = Runtime.getRuntime().exec(DIALOGBOX);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }

            outputStream.println("hello");
            outputStream.close();
            System.out.println("");

            try {
                TimeUnit.SECONDS.sleep(2);
            } 

            catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Path d= Paths.get(FILENAME);

            try {
                Files.delete(d);
            } 

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

            try {
                TimeUnit.SECONDS.sleep(3);
            } 

            catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public void killProc(){

        System.exit(0);

    }

当我按下Start时代码会运行但是当我按下Stop时它不会停止 单击开始按钮,停止按钮无效 我做错了什么?

2 个答案:

答案 0 :(得分:1)

只有一个Thread可以处理GUI操作,例如单击按钮。虽然这个线程还没有完成他的工作,但GUI被冻结,并且不会对其他输入做出反应。

如果我想要一个按钮来启动更长的任务,它应该在一个额外的线程中完成,比如SwingWorker,并且只有该线程的开始应该在GUI线程内完成(例如actionPerformed-method)。

答案 1 :(得分:0)

我假设开始按钮直接调用runProc,这意味着它正在Event Dispatch线程上运行。 然后,此线程停留在while(true)循环中,并且永远不会返回到应用程序。即停止按钮永远不会有机会运行。

你的开始按钮应该使用SwingWorker和SwingUtilities来调用EDT之外的方法和一个布尔变量来启动和停止线程与System.exit(0)

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.SwingWorker;

    public class TestProc{

    boolean isRunning = false;

    public TestProc(){
        JFrame f = new JFrame();
        JButton b = new JButton("Start");

        b.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                new SwingWorker<Void, Void>() {

                    public Void doInBackground() {
                        if(!isRunning){
                            isRunning = true;
                            runProc();
                        }
                        return null;
                    }
                }.execute();
            }
        });

        JButton b1 = new JButton("End");
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        killProc();
                    }
                });
            }
        });
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(new JPanel());
        f.getContentPane().add(b);
        f.getContentPane().add(b1);
        f.pack();
        f.setVisible(true);

    }

    public void runProc (){
        while(isRunning){
            System.out.println(".");
            try { Thread.sleep(100); } catch (InterruptedException e) {}
        }
    }

    public void killProc(){
        isRunning = false;
        System.out.println("DEAD!");
    }

    public static void main(String args[]){
        new TestProc();
    }
}