2011-09-01 2 views
1

Из кода ниже или ValueMutationEventHandler, почему я не могу сделать future2.get(), дождаться будущего2, чтобы завершить, а затем получить результаты?Java Future.get() не возвращается

Если я буду делать future2.get(), он будет ждать вечно.

import java.util.concurrent.BrokenBarrierException; 
    import java.util.concurrent.CyclicBarrier; 
    import java.util.concurrent.ExecutionException; 
    import java.util.concurrent.ExecutorService; 
    import java.util.concurrent.Executors; 
    import java.util.concurrent.Future; 
    import java.util.concurrent.TimeoutException; 

    import junit.framework.Assert; 

    import org.junit.Test; 

    import com.lmax.disruptor.BatchEventProcessor; 
    import com.lmax.disruptor.ClaimStrategy; 
    import com.lmax.disruptor.RingBuffer; 
    import com.lmax.disruptor.WaitStrategy; 

    int numPublisher = 1; 
    int numConsumer = 1; 
    int parties = numPublisher + numConsumer; 
    CyclicBarrier barrier = new CyclicBarrier(parties); 

    RingBuffer<ValueEvent> ringBuffer = new RingBuffer<ValueEvent>(
      ValueEvent.EVENT_FACTORY, 8192, 
      ClaimStrategy.Option.MULTI_THREADED, 
      WaitStrategy.Option.YIELDING 
    ); 

    int iteration = 10; 
    ValuePublisher valuePublisher = new ValuePublisher(
      barrier, ringBuffer, iteration 
    ); 

    ExecutorService execService = Executors.newFixedThreadPool(2); 
    Future future = execService.submit(valuePublisher); 

    ValueMutationEventHandler eventHandler = new ValueMutationEventHandler(Operation.ADDITION); 

    BatchEventProcessor<ValueEvent> eventProcessor = new BatchEventProcessor<ValueEvent>(ringBuffer, 
      ringBuffer.newDependencyBarrier(), 
      eventHandler 
    ); 

    barrier.await(); 
    Future future2 = execService.submit(eventProcessor); 

    ////////////////////////////// 
    // Why do I need sleep here? Why doesn't future2.get works? 
    ///////////////////////////// 
    Thread.sleep(1000); 

    Assert.assertEquals(eventHandler.getValue(), 45L); 

ответ

2

Вы можете использовать get(long timeout, TimeUnit unit), чтобы не ждать долго и Тайм-аут операции.

Использование выше вместо Thread.sleep(1000);, вам не нужно Thread.sleep(int)

Если Future.get не возвращает STH вам может понадобиться, чтобы проверить BatchEventProcessor, чтобы увидеть, что происходит там. Если он не возвращает ничего, Future.get тоже не сможет вернуть. Поместите точку отладки в BatchEventProcessor, чтобы убедиться, что она действительно возвращает результат в ожидаемый период времени, который вам нужен.