Java Future.get () не возвращается - PullRequest
       16

Java Future.get () не возвращается

1 голос
/ 01 сентября 2011

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

Если я сделаю 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 );

1 Ответ

2 голосов
/ 01 сентября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...