使用SwingWorker runnables

时间:2016-11-04 04:21:34

标签: java multithreading swing executorservice swingworker

我想向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);
    }
}

1 个答案:

答案 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()