我正在尝试使用下面扩展 FutureTask 类的 FutureResult 类在两个线程之间发出信号。运行脚本时,它会打印以下结果。
发送中:0
已发送:0
投票:FutureResult@513431
信号:FutureResult@513431
然后程序就永远挂掉了。我希望 FutureResult 实例应该从它的阻塞 get 方法返回值。然后在控制台打印结果。但是 FutureResult.get 永远阻塞。
import java.util.concurrent.*;
/**
* Created by someone on 20/08/2015.
*/
final public class FutureResult<T> extends FutureTask<T> {
private static final Object SS = "SS";
public FutureResult() {
super(() -> null);
}
public void signal(final T value) {
set(value);
}
public void signalError(final Throwable throwable) {
setException(throwable);
}
public static void main(String... args) throws Exception {
final ArrayBlockingQueue<FutureResult> queue = new ArrayBlockingQueue<>(1000000);
new Thread(() -> {
while (true) {
try {
final FutureResult poll = queue.take();
System.out.println("POLL: " + poll);
if (poll != null) {
poll.signal(SS);
System.out.println("SIGNALLED: " + poll);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(() -> {
for (int i = 0; i < 1; i++) {
final FutureResult<Object> result = new FutureResult<>();
System.out.println("SENDING: " + i);
queue.offer(new FutureResult());
try {
System.out.println("SENT: " + i);
result.get();
System.out.println("GOT : " + i);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}).start();
}
}
最佳答案
问题是:
queue.offer(new FutureResult());
您正在为一个 FutureResult
设置值,但这不是您正在等待的那个。只需将该行更改为:
queue.offer(result);
而且效果很好。
关于java - FutureTask.get 方法永远阻塞,尽管我正在从另一个线程设置它的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32420624/