Java Future.get()不';不归
根据下面的代码,或者,为什么我不能执行future2.get(),等待future2完成,然后获取结果 如果我做future2.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
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
中放置一个调试点,以确保它确实在您需要的预期时间范围内返回结果