从下面的代码或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 );
答案 0 :(得分:2)
您可以使用get(long timeout, TimeUnit unit)
,以便不要等待很长时间并超时操作。
使用上述代替Thread.sleep(1000);
,您不需要Thread.sleep(int)
如果Future.get没有返回......你可能需要检查BatchEventProcessor
以查看那里发生的事情。如果它没有返回anthing,Future.get也不能返回任何内容。将调试点放入BatchEventProcessor
以确保它确实在您需要的预期时间范围内返回结果。