2014-12-18 3 views
2

자바에서는 TimeoutException이 발생할 때 미래의 결과를 채우는 스레드의 현재 스택을 확인하고 싶습니다. TimeoutException에 의해 제공되는 스택 추적의 최상위 항목은 백그라운드 스레드의 상태가 아닌 future.get()이 호출 된 위치를 나타낼뿐입니다. 예를 들어,이 예에서,java - TimeoutException에서 미래의 스택 추적을 얻으려면 어떻게해야합니까?

ExecutorService executor = Executors.newSingleThreadExecutor(); 

Future<String> future = executor.submit(new Callable<String>() { 
    @Override 
    public String call() throws Exception { 
     Thread.sleep(10000); 
     return ""; 
    } 
}); 

try { 
    future.get(1, TimeUnit.MILLISECONDS); 
} catch (TimeoutException e) { 
    e.printStackTrace(); 
} catch (InterruptedException | ExecutionException e) { 
    e.printStackTrace(); 
} 

나는 최상위 항목이하는 Future.get 것으로 나타났습니다 (1, TimeUnit.MILLISECONDS) 항목이 아닌에 Thread.sleep (10000). Stack.sleep (10000)이 현재 실행되고 있기 때문에 스택 추적에 표시하고 싶습니다. 이 일을하는 우아한 방법이 있습니까?

실제 실행 문제가있는 경우 ExecutionException.printStackTrace()는 백그라운드 스레드에서 문제가 발생한 위치를 나타냅니다.

답변

3

참조가 있다면 스레드가 작업을 실행 중일 때 t.getStackTrace()을 호출 할 수 있습니다. 표준 라이브러리 인 ExecutorService 구현은 어떤 스레드가 작업을 실행하고 있는지 알려주지 않습니다. 당신은 스택 추적을 얻을 수

class MyTask implements Callable<String> { 
    private volatile Thread executorThread; 

    @Override 
    String call() { 
     executorThread = Thread.getCurrentThread(); 
     Thread.sleep(10000); 
     return ""; 
    } 

    Thread getExecutorThread() { 
     return executorThread; 
    } 
} 

그 방법은, 때 밖으로 메인 스레드 시간, 그것은 myTask.getExecutorThread().getStackTrace();

... 
MyTask myTask = new MyTask(); 
Future<String> future = executor.submit(myTask); 
... 
} catch (InterruptedException | ExecutionException e) { 
    StackTraceElement[] stack = myTask.getExecutorThread().getStackTrace(); 
    for (StackTraceElement element : stack) { 
     ...print it... 
    } 
} 
+0

응답 해 주셔서 감사합니다. 이것은 제가 현재 작성한 것과 매우 흡사합니다. –

0

해당 예외 추적을 가져올 수 없습니다.

예외 때문에 원인이없고 예외가 표시되지 않습니다.

+0

를 호출 할 수 있습니다

당신은 그것을 실행하는 어떤 스레드 자체가 녹음 작업을 할 수 _any_ 예외 중. 문제는 타임 아웃 예외가 풀 스레드에서 발생하지 않았기 때문에 풀 스레드에 대한 정보가 없다는 것입니다. 그것은 주 스레드에서 발생했습니다. 풀 스레드에는 예외가 없습니다. 풀 스레드는 여전히 즐겁게 달리고있었습니다. 주 스레드가 참을성이 없어져서 기다리는 것을 포기할 때였습니다. –

관련 문제