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