我想向ExecutorService提交一些SwingWorkers,并从他们那里获取Futures以便稍后查看他们是否已完成以及结果是什么。
但是,当我需要Future<?>
时,ExecutorService的提交方法只返回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");
}
}
Main - executor.submit(w)
部分给出了编译错误:
Type mismatch: cannot convert from Future<capture#1-of ?> to Future<Integer>
并询问我是否希望将其更改为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);
}
}
答案 0 :(得分:2)
您可能希望使用submit()
的此变体来明确显示结果类型:
<T> Future<T> submit(Runnable task, T result)
正如here所述,submit()
对result
没有做任何事情。 &#34;当任务成功完成后,调用future.get()
将返回您传入的结果。&#34;请注意,result
的类型与SwingWorker
结果类型T
的类型相匹配。
代码:
Integer i = 42;
Future<Integer> future = executor.submit(w, i);
System.out.println(future.get());
控制台:
42
done
在实际计划的大背景下,您希望在EDT上publish()
中间结果和process()
。