java - 使用 SwingWorker 可运行对象从 ExecutorService 获取正确类型的 Future

标签 java multithreading swing executorservice swingworker

我想向 ExecutorService 提交一些 SwingWorkers,并从它们那里获取 Futures,以便稍后查看它们是否完成以及结果是什么。

但是,ExecutorService的submit方法只会返回Future<?>当我想要 Future<Integer>

那么,问题:

  • 我是否正确扩展了 SwingWorker?第一个泛型类型是 SwingWorker 上的 get() 返回的类型,因此我猜测这也是 Future get() 方法将返回的类型。

  • SwingWorker 使用错误吗? (尝试阅读有关此问题的信息,我看到大多数人将 Callables 提交到 ExecutorService)如果是这样,什么会更好以及转换它的最佳方法是什么? (我的 SwingWorker 的实际扩展比这个示例更复杂,并且更新了 GUI 等)。我开始尝试在新类中实现 Callable,但我不确定如何实现发布/处理过程(没有双关语)。

重现问题的一些示例代码:

SwingWorker 扩展

import javax.swing.SwingWorker;

public class Worker extends SwingWorker<Integer, Void>
{
    public Worker ()
    {

    }

    @Override
    public Integer doInBackground()
    {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return 1;
    }

    @Override
    public void done()
    {
        System.out.println("done\n");
    }
}

主要 - executor.submit(w)部分给出编译错误:

Type mismatch: cannot convert from Future<capture#1-of ?> to Future<Integer>

并询问我是否愿意将 future 更改为 Future<?> 类型或投 executor.submit(w)部分为Future<Integer> .

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main
{
    public static void main (String[] args)
    {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        Worker w = new Worker();
        Future<Integer> future = executor.submit(w);
    }
}

最佳答案

您可能希望使用 submit() 的这种变体来使结果类型明确:

<T> Future<T> submit(Runnable task, T result)

正如 here 所讨论的,submit() 不会对 result 执行任何操作。 “当任务成功完成时,调用 future.get() 将返回您传入的结果。”请注意,result 的类型与 SwingWorker 结果类型 T 匹配。

代码:

Integer i = 42;
Future<Integer> future = executor.submit(w, i);
System.out.println(future.get());

控制台:

42
done

在实际程序的更大上下文中,您需要publish()中间结果并在EDT上process()它们。

关于java - 使用 SwingWorker 可运行对象从 ExecutorService 获取正确类型的 Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40415236/

相关文章:

java - 无法在 android 中启动 AlertDialog 框

java - 使用 SwingWorker 高效发布

windows - pthreads 和 CreateThread 的死锁

java - 写入 NFS 存储的文件有时会损坏

Java递归参数

java - Jsoup 删除引号和撇号

c# - 高性能套接字上的异步等待与线程池与多线程(C10k 解决方案?)

java - 如果放置在 setVisible(true) 之后,JDialog 中的事件处理程序将不起作用

java - 如何将图像添加到六边形网格中的六边形中?

java - key 适配器不工作