Java Future.get()不返回

时间:2011-09-01 09:13:34

标签: java multithreading disruptor-pattern

从下面的代码或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 个答案:

答案 0 :(得分:2)

您可以使用get(long timeout, TimeUnit unit),以便不要等待很长时间并超时操作。

使用上述代替Thread.sleep(1000);,您不需要Thread.sleep(int)

如果Future.get没有返回......你可能需要检查BatchEventProcessor以查看那里发生的事情。如果它没有返回anthing,Future.get也不能返回任何内容。将调试点放入BatchEventProcessor以确保它确实在您需要的预期时间范围内返回结果。