0

現在、ボタンの1つが時間のかかる再帰関数を実行するjFrameウィンドウを持っています。

私が欲しいのは、ウィンドウの別のボタンをクリックすると、プログラムが関数の実行を停止することです。

これが私のコードです:

 public class CrawlerInterface extends javax.swing.JFrame 
 {
       public CrawlerInterface() 
       {
           initComponents();
       }

    private void playButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {

       playButton.setEnabled(false);
       stopButton.setEnabled(true);

       Crawler.crawl("http://www.mywebsite.com", "site"); //That's the one to interrupt
    }

    private void stopButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {
       stopButton.setEnabled(false);
       playButton.setEnabled(true);

       //Interrupt crawl function here!
    }
    [...]
 }

スレッドを使用して上記のコードを変更するにはどうすればよいですか? 糸を使わずにできる方法があれば教えてください!

前もって感謝します。

4

1 に答える 1

0

コードをバックグラウンド スレッドで実行する場合 (UI コンポーネントに触れない限りは問題ありません) interrupt、スレッドを実行できます。または、再帰を停止するための基本条件として使用するブール変数を設定します。つまり、メソッドに入って変数が設定されたら、再帰を停止します。
これが最初のサンプルです

private static volatile boolean stop = false;  

public static void stop(){  
   stop = true;  
}  

public void Crawler.crawl(String url, String word){  
    if(stop) return;
    else{ ... //recurce}  
}  



private void playButtonActionPerformed(java.awt.event.ActionEvent evt) 
{

       playButton.setEnabled(false);
       stopButton.setEnabled(true);

       Thread t = new Thread(new Runnable(){  
              @Override  
              public void run(){  
                    Crawler.crawl("http://www.mywebsite.com", "site"); //That's the one to interrupt  
               }  
        });  
        t.start();  
}  


 private void stopButtonActionPerformed(java.awt.event.ActionEvent evt) 
    {
       stopButton.setEnabled(false);
       playButton.setEnabled(true);

       Crawler.stop();  //or you could keep reference to t and call interrupt
    }
于 2013-02-09T22:23:00.013 に答える