2017-02-08 18 views
0

У меня есть часть кода, которая должна составлять 15 запросов параллельно, а затем ждать завершения всех запросов перед продолжением.Java Future: получите время за запрос

Каждый запрос занимает от 500 до 2500 мс. Есть ли способ в Java, чтобы получить время, которое требуется для каждого будущего для завершения запроса?

+0

Если вы хотите ждать всех потоков для завершения, а затем продолжить, вы можете использовать [CountDownLatch] (https://docs.oracle.com/javase/8/ документы/API/Java/Util/параллельный/CountDownLatch.html). – FMiscia

ответ

0

Я не знаю никаких встроенных методов в будущем api. Однако, если вы используете ListenableFutures, вы можете запустить таймер, когда будете делать будущее, и остановить таймер в обратном вызове onSuccess или onFailure. В частности, это может выглядеть примерно так:

public void timeRequests(MyRequests[] requestsToMake) { 
    ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(requestsToMake.length)); 
long startTimeNanos = System.nanoTime(); 
long[] endTimes= new long[requestsToMake.length] 
for(int i =0; i < requestsToMake.length; i++){ 
    MyRequest req = requestsToMake[i]; 
    ListenableFuture<MyData> rFuture = service.submit(new Callable<MyRequest>() { 
    public MyData call() { 
return req.makeRequest(); 
} 
}); 
Futures.addCallback(rFuture, new FutureCallback<MyData>() { 

public void onSuccess(MyData data) { 
    endTimes[i]=System.nanoTime(); 
    //whatever else you do 
} 
public void onFailure(Throwable thrown) { 
    endTimes[i]=System.nanoTime(); 
    //whatever else you do 
} 
}); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^