2010-07-20 3 views
1

웹 서비스에 도달 한 1000 개의 스레드가 있고 호출에 걸리는 시간이 있습니다. 우리는 각 스레드가 주 응용 프로그램에 자신의 타이밍 결과를 반환하여 다양한 통계를 기록 할 수 있기를 바랍니다. 다양한 도구가 고려 된 점에 유의하십시오. 그러나 여러 가지 이유로 자체 작성해야합니다. 각 스레드가 타이밍을 반환하는 가장 좋은 방법은 무엇입니까? - 우리는 지금까지 두 가지 옵션을 고려했습니다. - 1. 스레드가 타이밍 결과를 얻으면 동기화 된 메서드를 제공하여 파일에 쓸 단일 스레드를 호출합니다. 이렇게하면 모든 각 스레드가 차례대로 (미정 인 순서로 있음에도 불구하고) 파일에 쓰고, 스레드가 타이밍 결과를 얻은 후에 호출이 이루어지기 때문에 쓰기를 기다리는 것이 차단되지 않습니다. 정말로 문제. 모든 스레드가 완료되면 주 응용 프로그램은 파일을 읽고 통계를 생성 할 수 있습니다. 2. Executor, Callable 및 Future 인터페이스 사용 가장 좋은 방법은 무엇입니까? 아니면 더 좋은 방법이 있습니까? 사전에 대단히 감사 폴Java : 여러 스레드에서 타이밍을 검색하는 가장 좋은 방법

+0

웹 서비스의 스레드 처리에 따라 달라질 수 있습니다. – hakish

답변

3

후자의 방법을 사용하십시오.

직원이 호출 가능을 구현합니다. 그런 다음 스레드 풀에 제출하고 각각에 대한 Future 인스턴스를 가져옵니다.

그러면 Futures에서 get()을 호출하여 계산 결과를 얻습니다.

import java.util.*; 
import java.util.concurrent.*; 

public class WebServiceTester { 

    public static class Tester 
     implements Callable { 
    public Integer call() { 
     Integer start = now(); 
     //Do your test here 
     Integer end = now(); 
     return end - start; 
    } 
    } 

    public static void main(String args[]) throws Exception { 
    ExecutorService pool = Executors.newFixedThreadPool(1000); 
    Set<Future<Integer>> set = new HashSet<Future<Integer>>(); 
    for (int i =0 ; i < 1000 i++) { 
     set.add(pool.submit(new Tester())); 
    } 
    Set<Integer> results = new Set<Integer>(); 
    for (Future<Integer> future : set) { 
     results.put(future.get()); 
    } 

    //Manipulate results however you wish.... 
    } 
} 
+0

이것은 내가 마음에서 가지고 있었던 정확하게 것이었다.. :)!!! – hakish

+0

답장을 보내 주셔서 대단히 감사드립니다. 매우 감사 – user396707

0

내가 생각할 수있는 또 다른 가능한 해결책은, 그것을 감소시키는 각 스레드는, (그들은 완성되어 신고) (자바 동시성 패키지에서)을 해, CountDownLatch를 사용하는 것입니다 다음 번에 모든 (완전하고 CountDownLatch가 0에 도달했습니다.) 메인 스레드가 행복하게 모든 것을 통과하여 시간을 묻습니다.

0

여기서 Executor 프레임 워크를 구현할 수 있습니다. 시간 처리는 Callable 객체로 처리 할 수 ​​있습니다. Future는 스레드가 처리를 완료했는지 식별하는 것을 도와줍니다.

0

결과에보고 할 스레드에 ArrayBlockingQueue을 전달할 수 있습니다. 그런 다음 대기열에서 파일에 쓰는 파일 쓰기 스레드를 가질 수 있습니다.

관련 문제