Java 有没有办法在swingworker完成之前阻止主线程?

Java 有没有办法在swingworker完成之前阻止主线程?,java,multithreading,swing,swingworker,Java,Multithreading,Swing,Swingworker,可能重复: 我已经读到这样做是非常糟糕的做法,但我认为这是我实现目标的最好方式。。。 在下面的示例中,是否有方法在swing worker完成之前阻止主线程 public void flashNode(Node node, int noOfFlashes) { GraphUpdater updater = new GraphUpdater(node, noOfFlashes); updater.execute(); } 和SwingWorker类 public cla

可能重复:

我已经读到这样做是非常糟糕的做法,但我认为这是我实现目标的最好方式。。。 在下面的示例中,是否有方法在swing worker完成之前阻止主线程

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;
    }

}
公共类GraphUpdater扩展SwingWorker{
节点;
内特诺夫拉;
公共图形编辑器(节点n,内部节点n){
节点=n;
无灰=无闪光;
}
@凌驾
受保护的整数doInBackground()引发异常{
Color origColor=node.getColor();

对于(inti=0;i如果您想要阻止,那么不要使用swing worker,只需这样做即可

changeNodeColor(node, Color.WHITE);
Thread.sleep(500);
changeNodeColor(node, origColor);
Thread.sleep(500);
在EDT上。SwingWorker的全部目的是不阻塞EDT


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

如我所述,在swing EDT期间,不要使用
Thread\sleep(int)
GUI简单冻结,直到
Thread\sleep(int)
结束,更多关于冻结的示例

您有三个(可能是四个)选项可以选择如何在某个时间段更新GUI,或者如何在每次执行某个操作时延迟GUI

  • 使用

  • 使用

  • 使用
    Runnable#Thread


把所有这些放在一起(加上
java.util.Timer
,执行被包装到
invokeLater

看到了吗?如果你想首先阻止主UI线程,为什么要使用Swingworker?你可以在主线程中运行代码。我忘了注意你的答案,从来没有真正建议过阻止EDT作为新手的答案,这种方式可能是一条通往地狱的路,而对Swing的EDT没有深入的了解,请删除这些words和代码谢谢。使用swing计时器,我可以强制它只有在计时器停止运行后才能退出该方法吗?@Josh我想是的,但是(很抱歉)当我看到你的帖子时,请将你关于计时器的想法/问题翻译成Java代码,然后大多数读者可以回答…,只需编辑你的问题并添加新代码,例如javax.swing.Timer with SwingWorker