2013-10-29 2 views
1

이 문제의 원인을 파악할 수 없습니다.스레드가 멈 추면 워크 플로를 종료 할 수 없습니다.

문제 :

1) 내 응용 프로그램에 대한 타이머를 설정하는 Thread.sleep를 기능을 사용하고 있습니다.

2) 이제 사용자가 웹 페이지에 들어가 자마자 타이머가 시작됩니다. 사용자가 링크를 클릭하면 타이머 (스레드)가 중지 된 다음 새 타이머가 시작됩니다.

3) 3 초 동안 아무 활동도 없다면 타이머가 끝나고 웹 페이지와 관련된 워크 플로도 끝납니다.

코드 :

:

DownloadSummariesPage.java

public DownloadSummariesPage(){ 

abc = new SimpleThread(this); 

Link<Void> link = new Link<Void>("downloadSummaryLink") { 

public void onClick() { 

        boolean threadStatus = abc.checkStatus(); 

        if (threadStatus) { 
         abc.interrupt(); 
         abc.stop(); 
         abc = new SimpleThread(DownloadSummariesPage.this); 
         abc.start(); 
         } 
        else 
         { 
         LOG.debug("thread is dead now"); 
         endWorkflow(); 
         LOG.debug("ending the workflow"); 
         setResponsePage(MenuPage.class);       
         } 
        } 

}; 
abc.start(); 
} 


public void endWorkflow() { 
    abc.interrupt(); 
    abc.stop(); 
    boolean downloadReport = false; 
    LOG.debug("before action 201 inside endworkflow"); 
    Map<String, Serializable> inputs = new HashMap<String, Serializable>(); 
    inputs.put("downloadReport", downloadReport); 
    try { 
     wf.doAction(id, 201, inputs);//do not worry about this its for workflow 
     String empty = ""; 
     populateDownloadReportDatabase(empty); 

     setResponsePage(MenuPage.class); 
    } catch (Exception e) { 
     LOG.debug("Exception while performing 201 workflow, getControlCancel " 
       + e); 
    } 
} 
} 

내 다음 수업 스레드를 생성

class SimpleThread extends Thread { 
private static final Logger LOG = Logger.getLogger(SimpleThread.class); 

boolean stillActive = true; 
DownloadSummariesPage dsp; 

SimpleThread(DownloadSummariesPage dp) { 
    this.dsp = dp; 
} 

public void run() { 
    // 5sec timer 
    LOG.debug("inside run method"); 
    try { 
     Thread.sleep(3000); 
     stillActive = false; 
    } catch (InterruptedException e) { 
     LOG.debug("Exception in thread " + e); 
     e.printStackTrace(); 
    } 
    LOG.debug("before endworkflow"); 
    dsp.endWorkflow();//so this is what i actually want to do... 
    LOG.debug("at the end of simplethread"); 

} 

public boolean checkStatus() { 
    return stillActive; 
} 
} 

케이스 SimpleThread.java입니다

1) Whats Happening : 사용자 로그인 스레드가 잠자기, 사용자가 링크를 클릭하면 멈추고 사용자가 다시 클릭하면 다시 생성되며 사용자가 3 초 동안 아무 것도하지 않으면 SimpleThread 클래스의 stillAlive 변수 false로 설정되고 이제는 사용자가 작업 흐름을 완벽하게 끝낼 때 ...

2) 내가 원하는 것 : 사용자가 스레드를 시작하고 해당 사용자가 활동을하지 않으면 stillAlive 변수가 false로 설정됩니다. false이고 dsp.endWorkflow(); 문이 워크 플로를 종료해야합니다. 권리 ? 그러나 실제로는 endWorkflow() 함수 내부에 도달 한 후에 멈추고 워크 플로를 실제로 끝내지는 않습니다 ...

희망 사항을 이해할 수 있도록 최선을 다했습니다. 시간 내 주셔서 감사합니다 ..

내가 어떤 도움을 주셔서 감사합니다

..

답변

1

그래서 여기에 몇 가지 이상한 일들이 있습니다.
처음에는 3 초 동안 아무런 중단없이 sleep sleep을 가정하므로 onClick 메서드에서 다시 호출하는 dsp.endWorkflow()을 호출합니다.

는 두번째 stillAlive 플래그되어야 volatile

boolean volatile stillActive = true; 

것이 섹션에 의해 제기 가능한 오류/버그. 스레드가이 과정을 중단 자고 때 가정 때문에

if (threadStatus) { 
abc.interrupt(); 
abc.stop();// you cannot get to this like just after interrupt, maybe thread abc goes first 
abc = new SimpleThread(DownloadSummariesPage.this); 
abc.start(); 
} 

후 중지하지만, 스레드가 당신이 그것을 방해 직후 작업의 완료하는 것이이 (당신이 그것을 중지하기 전에) 할 수 있습니다. 그래서 그냥 멈추는 것이 낫습니다. 아니면 스레드가 캐치에 도달했을 때 return입니다.

try { 
     Thread.sleep(3000); 
     stillActive = false; 
    } catch (InterruptedException e) { 
     LOG.debug("Exception in thread " + e); 
     e.printStackTrace(); 
     return;//////give up the rest work. so you don't need to call the stop too. 
    } 

그리고 오류가 여기 있다가 사용자가 취소, 또는 새로운 다운로드, 그냥 그 수면을 완료 스레드와 dsp.endWorkflow() 전화를 클릭하지 않는 가정, 그래서이 방법이야?

public void endWorkflow() { 
    abc.interrupt(); 
    abc.stop();//error here! 
    boolean downloadReport = false;//this is unreachable 
} 

은 그냥 abc 스레드에 의해이 방법을 요구하고,보고, 당신이 downloadReportfalse에를 설정하기 전에 오류가, 당신은 단지 방법 내부의 스레드를 죽이고 있다는 것입니다. 그래서 그것은 이렇게 될 것입니다.

public void endWorkflow() { 
    boolean downloadReport = false;//this is unreachable 
    abc.interrupt(); 
    abc.stop();//error here! 
} 

내가 도움이되기를 바랍니다.

+0

귀하의 모든 노력에 감사드립니다. 감사합니다. 그것들은 변수 downloadReport (도달 할 수 없음)에 문제가 없지만 abc.stop()을 사용하여 SimpleThread 클래스 (dsp.endWorkflow)에서 호출 할 때이 명령문이 실행되지 않는 이유를 알아 내려고합니다. 이것에 대한 의견 ..? 고마워요. – Ashish

+0

내가 말했듯이 스레드에서 2 초가 생각 나면 사용자 클릭을 고려하십시오. 처음에는 '인터럽트'를 호출 한 다음 '중지'합니다. 그래서 이것은 여러분이 인터럽트 할 때 쓰레드가 잠에서 깨어나고 코드의 나머지 부분을 수행 한 후에 멈추는 것이 가능합니다. 당신은 방해하지 않고 멈추게 할 수 있습니다. –

관련 문제