0

我目前有一个 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 回答