java - FutureTask.get 方法永远阻塞,尽管我正在从另一个线程设置它的值

标签 java multithreading

我正在尝试使用下面扩展 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/

相关文章:

Python 请求多线程 "Max Retries exceeded with url"Caused by <class 'socket.gaierror' >

java - 问题 com.google.gdata.util.ResourceNotFoundException : Not Found with Google Analytic

java - 带有 Java AWT 图形的 TTF 字体

java - 具有可选的 Google App Engine 支持的标准 Java webapp

c++ - 多生产者-消费者执行的效率

ios - NSOperationQueue 的线程不会消亡

java - 使用paintComponent在JFrame中镜像对象

java - Spring Boot @Autowired Jpa 存储库返回 Null

c++ - 嵌套的 openMP 并行化结合 std::thread

ios - 在 UITableView 中更改 AVPlayer 的 playerItem