1

从下面的代码或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 );
4

1 回答 1

2

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

用上面代替Thread.sleep(1000);,你不需要Thread.sleep(int)

如果 Future.get 没有返回,你可能需要检查BatchEventProcessor那里发生了什么。如果它不返回任何东西 Future.get 也不能​​返回任何东西。放置一个调试点BatchEventProcessor以确保它确实在您需要的预期时间范围内返回结果。

于 2011-09-01T09:29:01.613 回答