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;
}
그것은'는 Thread.currentThread()를 사용하는 더 나은 패턴처럼 볼 필요가있다. isInterrupted()를'당신이 플래그를 삭제하지 않도록 . 이 경우에는 문제가되지 않지만 다른 사람들에게는 ... – Gray
@Ernest, 답장을 보내 주셔서 감사합니다. 불행히도 저에게 스레드는 작은 작업 단위로 처리 될 수 없습니다. 'run()'메소드에서 제 3 자 도구에 대한 호출이 있습니다 {public void run() { while (! Thread.interrupted()) { // 긴 태스크입니다. 나는 쉬는 시간이 필요합니다! } } – Lai
마지막 수단으로 항상'Thread.stop()'이 있습니다. 때때로, 그것은 당신이 가지고있는 유일한 대안입니다; 이 경우 중 하나 일 수 있습니다. –