2013-02-09 2 views
0

В настоящее время у меня есть окно jFrame, в котором одна из кнопок выполняет долговременную рекурсивную функцию.Использование потока для прерывания рекурсивной функции внутри класса 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! 
    } 
    [...] 
} 

Как я могу изменить приведенный выше код, чтобы сделать это, используя нить? Если есть способ сделать это без использования потоков, пожалуйста, скажите мне!

Заранее спасибо.

+0

Вам необходимо резьб. – bmargulies

+0

Как я могу использовать их здесь? – user1881815

+0

SwingWorker, если быть точным. http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html –

ответ

0

Если вы запустите свой код в фоновом потоке (отлично, если он не касается каких-либо компонентов пользовательского интерфейса), вы можете 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 
    } 
+0

Конечно, пожалуйста, дайте мне код. Я пробовал много чего, но я потерялся с понятиями runnable классов, запускает методы ... и т. Д. :( – user1881815

+0

Что такое 'Crawler.crawl'? – Cratylus

+0

Я не мог написать его здесь, потому что он слишком длинный, но это нерешенная рекурсивная функция, которая сканирует веб-сайт и записывает все его статьи в txt-файлах в определенной папке. – user1881815

Смежные вопросы