2012-07-02 2 views
0

Callable, Executor 및 Future 객체를 사용하여 별도의 스레드에서 웹 서비스를 병렬로 호출합니다. 모든 웹 서비스 호출을 실행 한 후에 결과를 jsp로 표시합니다.동시 Java 프로그래밍에서 스레드 실행을 지정하는 방법은 무엇입니까?

여기에 나는 의심 스럽다 : webservice 호출 중 하나가 실패하면 jsp에서 성공적인 호출의 결과를 어떻게 표시 할 수 있습니까?

하나의 스레드가 그 상황에서 실행하는 데 더 많은 시간이 걸리는 경우 해당 응답을 건너 뛰고 나머지 결과를 jsp로 표시하려고합니다.

하나의 웹 서버에 Thread.sleep(1000)을 추가하려고했지만 응답도 jsp에서 지연됩니다.

답변

0

, 당신은 모든 당신 callables 제출 한 후 타임 아웃을 종료 할 수 있습니다 :

executor.shutdown(); 
boolean terminated = executor.awaitTermination(1, TimeUnit.SECONDS); 

을 그리고 당신은 작업을 제출할 때 집행 인에 의해 반환 된 미래를 저장 한 경우 목록을 반복하여 어떤 작업이 완료되지 않았는지 확인할 수 있습니다.

if (!terminated) { 
    for (Future f : futureList) { 
     if (!f.isDone()) { System.out.println("This task " + f + " did not complete"); } 
    } 
} 
+0

@JohnVint 답변을 삭제 한 이유는 무엇입니까? – assylias

+0

안녕하세요, assylias는 executer.shutdown() 후에 위의 코드를 작성해야합니다. excute.shotdown 전에 예, 내 작업을 제출하는 경우 더 많은 시간을 내 질문은 그것이 60 초 이상 걸리는 경우 어떻게 그 작업을 취소 할 수 있습니까? – rev

+0

예 : 통화 종료 및 awaitTermination이 종료 된 경우 모든 것이 완료되었지만 아직 실행되지 않은 작업이있는 경우 그런 다음 future를 탐색하고'future.cancel (true)'를 호출하여 아직 실행중인 작업을 취소 할 수 있습니다. 또는'awaitTermination' 다음에'executor.shutdownNow()'를 호출하여 아직 실행중인 모든 작업을 취소 할 수 있습니다. executer.shutdown 이후에 – assylias

2

다른 모든 스레드를 시작하는 기본 스레드에서 CountdownLatch을 고려할 수 있습니다.

모든 스레드를 생성 한 후에 주어진 시간 초과로 래치를 기다리는 것이 좋습니다. 각 스레드는 완료되면 래치에서 countDown() 메서드를 호출해야합니다. 따라서 모든 스레드가 완료되거나 시간 초과가 만료되면 주 스레드가 진행됩니다. 당신은 실행 프로그램 서비스를 사용하는 경우

0

누군가가이 글을 게시하고 답변을 삭제했지만 도움이 될 것이라고 생각했습니다.


당신이 사용할 수있는 ExecutorCompletionService

당신이 ExecutorService를에 poll을 렌더링 할 준비가되면 당신은 단순히 ExecutorService를 제출 할 수 있습니다. 가장 최근에 완료된 미래를 제공하거나 앉아서 준비가 될 때까지 기다립니다.

ExecutorCompletionService e = new ExecutorCompletionService(...); 

for(int i =0; i < n ; i++) 
    e.submit(..); 

당신이 사용 사례를 설명해야

for(int i =0 ; i < n; i++){ 
    T t = e.poll(); //or with a timeout: T t = e.poll(100, TimeUnit.MILLISECONDS); 
    //do rendering 
} 

준비하는 동안.