2016-09-29 3 views
-1

я есть JFramePanel с двумя кнопками, который работает этот код:убить Java proccess во время работы время цикла

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 прогонов кода, но когда я нажимаю Прекратите это не останавливая старте кнопка остается нажатой, а кнопка «Стоп» не действует Что я делаю неправильно?

+0

Как мы должны всегда знать, почему ваш кнопки что-то делают? Не думаете ли вы, что нам нужно будет увидеть код за вашими кнопками/панелями, чтобы ответить на ваши вопросы? Вы думаете, что мы волшебники здесь? – GhostCat

ответ

1

Существует только одна тема, которая обрабатывает действия с графическим интерфейсом, например, одним нажатием кнопки. Хотя этот поток еще не завершил свою работу, графический интерфейс замораживается и не реагирует на другие входы.

Если я хочу, чтобы кнопка запускала более длинную задачу, она должна выполняться в дополнительном потоке, таком как SwingWorker, и только начало этого потока должно выполняться в потоке графического интерфейса (например, метод actionPerformed).

+0

Итак, как я могу завершить текущий код? –

+0

Получил это !!! спасибо, я использовал SwingWorker - он отлично работает –

0

Я предполагаю, что кнопка запуска вызывает runProc напрямую, что означает, что она запущена в потоке отправки событий. Эта тема затем застревает в течение (истинного) цикла и никогда не возвращается в приложение. То есть кнопка остановки никогда не будет работать.

Ваша кнопка запуска должен лучше использовать 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(); 
    } 
} 
Смежные вопросы