2013-06-07 5 views
1

정말이 사이트의 친절한 마법사의 도움이 필요합니다. 나는 execute()에 내 AbstractHandler이라는 직업을 만들었습니다. 작업에 진행 모니터가 있으며 작업을 중단하려고 시도 할 때까지 모든 것이 올바르게 작동합니다.Eclipse 작업에서 스레드를 중지하려면 어떻게합니까?

사용자가 취소 버튼을 클릭하면 진행 모니터 화면이 꺼지지 만 작업 내에서 시작된 스레드가 백그라운드에서 계속 실행됩니다. 작업에서 cancel()을 호출해도 하위 스레드는 중지되지 않습니다. interrupt()을 호출해도 아무런 효과가 없습니다.

public Object execute(ExecutionEvent event) throws ExecutionException { 


    ... 
    job = new Job("Doing my job") { 

     @Override 
     protected IStatus run(IProgressMonitor monitor) { 
      monitor.beginTask("Running a length thread",10); 
      monitor.worked(1); 
      Thread unstoppableThread; //the pain in my neck 


        try { 
         unstoppableThread = new Thread() { 
          public void run() { 

           //A lengthy process 
          } 

         }; 

        int i = 1; 
        while(unstoppableThread.isAlive()){ 

         if(monitor.isCanceled()){ 
          //job.cancel(); doesn't work 
          //IJobManager manager = Job.getJobManager(); 
          //manager.cancel(job); doesn't work 
          //unstoppableThread.interrupt(); doesn't work too 
          return Status.CANCEL_STATUS; 
         } 

         try { 
          if(i<8)monitor.worked(1); 
          i++; 
          TimeUnit.SECONDS.sleep(1); 

         } 
         catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

        } 


      }finally{ 
       monitor.done(); 
      } 

      return Status.OK_STATUS; 
     }          //end of Job#run() 

    };           //end of Job block 

    job.setUser(true); 
    job.schedule(); 
    return null; 
    } 

답변

2

당신은 "멈출 수없는 스레드"협력이 필요합니다; 자신의 인터럽트 플래그를 주기적으로 확인하고 그것이 참이 될 때 중단해야합니다. 그런 다음 "취소"코드에서 unstoppableThread.interrupt()으로 전화하면 실제로 작동합니다. 즉

, 당신의 거침없는 스레드의 run() 방법은

public void run() { 
    while (!Thread.interrupted()) { 
     // Do a little work 
    } 
} 
+0

그것은'는 Thread.currentThread()를 사용하는 더 나은 패턴처럼 볼 필요가있다. isInterrupted()를'당신이 플래그를 삭제하지 않도록 . 이 경우에는 문제가되지 않지만 다른 사람들에게는 ... – Gray

+0

@Ernest, 답장을 보내 주셔서 감사합니다. 불행히도 저에게 스레드는 작은 작업 단위로 처리 될 수 없습니다. 'run()'메소드에서 제 3 자 도구에 대한 호출이 있습니다 {public void run() { while (! Thread.interrupted()) { // 긴 태스크입니다. 나는 쉬는 시간이 필요합니다! } } – Lai

+1

마지막 수단으로 항상'Thread.stop()'이 있습니다. 때때로, 그것은 당신이 가지고있는 유일한 대안입니다; 이 경우 중 하나 일 수 있습니다. –

관련 문제