2013-02-09 3 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

코드를 백그라운드 스레드 (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 
    } 
+0

물론, 제발, 제발 코드를 좀주세요. 나는 많은 것을 시도했지만 실행 가능한 클래스의 개념, 메소드 실행 ... 등으로 인해 길을 잃었습니다. : – user1881815

+0

'Crawler.crawl '이란 무엇입니까? – Cratylus

+0

너무 길기 때문에 여기에 쓸 수는 없지만 웹 사이트를 크롤링하고 특정 폴더의 txt 파일에 기사를 모두 쓰는 스레드되지 않은 재귀 함수입니다. – user1881815