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