Java Future.get()不';不归

Java Future.get()不';不归,java,multithreading,disruptor-pattern,Java,Multithreading,Disruptor Pattern,根据下面的代码,或者,为什么我不能执行future2.get(),等待future2完成,然后获取结果 如果我做future2.get(),它将永远等待 import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutionException; import java.ut

根据下面的代码,或者,为什么我不能执行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 );
import java.util.concurrent.BrokenBarrierException;
导入java.util.concurrent.CyclicBarrier;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.concurrent.Future;
导入java.util.concurrent.TimeoutException;
导入junit.framework.Assert;
导入org.junit.Test;
导入com.lmax.disruptor.BatchEventProcessor;
导入com.lmax.disruptor.ClaimStrategy;
导入com.lmax.disruptor.RingBuffer;
导入com.lmax.disruptor.WaitStrategy;
int numPublisher=1;
int numConsumer=1;
国际缔约方=numPublisher+numConsumer;
自行车承运人屏障=新的自行车承运人(双方);
RingBuffer RingBuffer=新的RingBuffer(
ValueEvent.EVENT_工厂,8192,
ClaimStrategy.Option.MULTI_线程,
WaitStrategy.Option.YIELDING
);
int迭代=10;
ValuePublisher ValuePublisher=新的ValuePublisher(
屏障,环形缓冲区,迭代
);
ExecutorService Executors=Executors.newFixedThreadPool(2);
Future=execService.submit(valuePublisher);
ValueMutationEventHandler事件处理程序=新的ValueMutationEventHandler(Operation.ADDITION);
BatchEventProcessor eventProcessor=新的BatchEventProcessor(ringBuffer,
ringBuffer.newDependencyBarrier(),
事件处理程序
);
障碍。等待();
Future future2=execService.submit(事件处理器);
//////////////////////////////
//为什么我需要在这里睡觉?为什么future2.get不起作用?
/////////////////////////////
睡眠(1000);
Assert.assertEquals(eventHandler.getValue(),45L);
您可以使用
get(long timeout,TimeUnit)
来避免长时间等待和操作超时

使用上述方法代替
Thread.sleep(1000),您不需要
线程。睡眠(int)

如果Future.get没有返回某个内容,您可能需要检查
BatchEventProcessor
以了解其中的情况。如果它不能返回任何未来,get也不能返回任何东西。在
BatchEventProcessor
中放置一个调试点,以确保它确实在您需要的预期时间范围内返回结果