2011-09-07 4 views
2

:자바 수면 interupted 사람이 오류 설명 할 수 예외

private static ExecutorService es = Executors.newFixedThreadPool(1);; 
    private static List<Future<?>> futures = new ArrayList<Future<?>>(); 

    futures.add(es.submit(new Callable<Object>() { 
     public Object call() throws Exception { 
      try{ 
       Polling.start();  //has an while(true) loop 
      } catch (Exception e){ 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    })); 

    Thread.sleep(2000); 

    System.out.println("stopping..."); 
    es.shutdownNow(); 
    futures.clear(); 

이 제공 :

java.lang.InterruptedException: sleep interrupted 

어떻게 main 메소드의 지연을 처리하여, 위의 예외를 피하기 위해를?

당신은 무한 루프에서 잠을 계속 이는 호출을 설정하는

java.lang.InterruptedException: sleep interrupted 
    at java.lang.Thread.sleep(Native Method) 
    at bus.Polling.start(Polling.java:107) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
+2

show stacktrace – confucius

답변

0

스택 추적, 나중에 강제로 전체 실행 프로그램 서비스를 종료하여 그 호출 종료합니다. 귀하의 호출 가능 번호가 정상적으로 종료되었거나 강제 종료하지 않은 경우이 예외가 발생하지 않습니다.

이 코드로 실제로 무엇을 달성하려고합니까?

+0

하위 Java 프로그램을 시작/중지 할 수있는 방법이 필요합니다. 하위 프로그램은 이벤트 폴링을 수행하므로 .start() 호출은 폴링을 시작합니다. 그러나 부모 프로그램에서 프로그램을 시작하는 방법을 원하지만 종료해야합니다. 종료하는 것은 스레드를 죽이는 것입니다. 나는 그것을 반영하기 위해 질문을 편집했다. – Larry

0

main 스레드가 완료되어 종료되기 때문에 호출 가능을 실행하는 스레드가 인터럽트되고 있습니다. 이 문제를 해결할 수있는 몇 가지 방법이 있습니다. 한 가지 방법은 실행 스레드를 데몬으로 선언하는 것입니다.

ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() { 
    @Override 
    public Thread newThread(Runnable runnable) { 
     Thread thread = Executors.defaultThreadFactory().newThread(runnable); 
     thread.setDaemon(true); 
     return thread; 
    } 
}); 

+0

감사합니다, 내가 성취하고자하는 것에 관해서 : Peter에게 보내는 코멘트보기 – Larry

0

es.shutdownNow()보다 es.shutdown()을 사용하면 InterruptedException이 사라집니다. 그러나 문맥이 명확하지 않으면 질문에 대답하기가 어렵습니다.

당신의 문맥을 exaplaining에 응답 :

1) 집행자 서비스에 작업을 제출하고 해당 미래를 얻을 수 있습니다.

2) 작업을 취소하기 위해 적절한 이벤트가 수신 될 때마다이 미래를 사용하십시오. future.cancel (true)를 호출합니다.

3) 향후 작업에서 스레드가 중단 된 경우 루프에서 빠져 나와 작업이 완료되도록하십시오.

4

InterruptedException은 Executor가 Callable에게 수행중인 작업을 중단하고 정리하고 종료하도록 알리는 데 사용되는 Java 메커니즘입니다.

당신이 그것을보고 싶지 않다면, 그것을 잡으십시오.

2

당신은 당신이 원하는 것을하고 있습니다. 폴링 클래스에 무한 루프가 있기 때문에 인터럽트를 중지하는 적절한 방법입니다. Exception에 관해서는 Polling-Class 내부에 잡아서 for-loop를 빠져 나온다.

관련 문제