有没有办法阻止主线程直到完成swingworker?

时间:2011-11-24 17:00:21

标签: java multithreading swing swingworker

  

可能重复:
  How do I wait for a SwingWorker's doInBackground() method?

我已经读过这样做非常糟糕的做法,但我认为这是实现目标的最好方式...... 有没有办法阻止主线程,直到swing工作者完成以下示例?

public void flashNode(Node node, int noOfFlashes) {
    GraphUpdater updater = new GraphUpdater(node, noOfFlashes);
    updater.execute();
}

SwingWorker

    public class GraphUpdater extends SwingWorker<Integer, Integer> {
    Node node;
    int noOfFlashes;

    public GraphUpdater(Node n, int noFlashes) {
        node = n;
        noOfFlashes = noFlashes;
    }

    @Override
    protected Integer doInBackground() throws Exception {
        Color origColor = node.getColor();
        for (int i=0; i<noOfFlashes; i++) {
            changeNodeColor(node, Color.WHITE);
            Thread.sleep(500);
            changeNodeColor(node, origColor);
            Thread.sleep(500);
        }

        return 1;
    }

}

提前致谢

2 个答案:

答案 0 :(得分:2)

正如我所提到的,在Swing EDT期间永远不要使用Thread#sleep(int),在Thread#sleep(int)结束之前使用GUI简单冻结,在Concurency in Swing中更多地使用冻结here

你有三个(可能是四个)选项如何在某个时期更新GUI或者每次执行一些延迟

将所有here(加java.util.Timer一起放入invokeLater包含的执行中

答案 1 :(得分:1)

如果你想阻止,那就不要使用摇摆工作者,只需做

changeNodeColor(node, Color.WHITE);
Thread.sleep(500);
changeNodeColor(node, origColor);
Thread.sleep(500);
在美国东部时间上。 SwingWorker的全部目的是阻止EDT。

如果您只想以特定间隔更改组件的颜色(即闪烁组件),那么javax.swing.Timer可能更合适。