gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:45:06 25 4
gpt4 key购买 nike

我想向 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com