gpt4 book ai didi

java - 调用SwingWorker run是否有错误以及如何同步doInBackground?

转载 作者:行者123 更新时间:2023-11-30 03:32:29 25 4
gpt4 key购买 nike

我使用 SwingWorker 作为包装非 swing 任务/操作的方法,其前后方法始终在事件调度线程中运行(换句话说:我在 doInBackground 中调用抽象方法,然后调用)然后我在 did 方法中调用 after )。这最近开始引起很多麻烦,因为 doInBackground 中发生的任何事情都必须同步。我注意到,如果我调用 run 而不是execute,问题就会消失,但据我了解, run 方法的工作原理与 Thread 中的相同,它只是在调用它的完全相同的线程中启动执行,而不是创建一个新的线程一,因此,如果我从 EDT 调用 run,则 doInBackground 会在 EDT 上执行。我的想法正确吗?如何将 doInBackground 方法与在工作线程上调用执行的线程同步?

我使用了以下代码,但它似乎正在创建线程锁:

private Object LOCK = new Object();    

public final void method() {

someObject.before();

SwingWorker<Void, Void> worker1 = new SwingWorker<Void, Void>() {

protected Void doInBackground() throws Exception {

methodExt();
return null;
}

protected void done() {
someObject.after();
synchronized (LOCK) {
LOCK.notifyAll();
}
}
};

worker1.execute();

synchronized (LOCK) {
try {
LOCK.wait();
} catch (InterruptedException exception) {
exception.printStackTrace();
}
}
}

最佳答案

您永远不应该在 EDT 上阻塞。 SwingWorker 的全部要点在于,它允许您触发任务在后台线程上运行,并安排其他代码在后台作业完成后在 EDT 上运行,无需同时阻止 EDT。因此,如果您想在 EDT 上运行 methodA(),然后在后台运行 methodB(),然后在 EDT 上运行 methodC() B 完成后,答案是从 SwingWorkerdone() 方法调用 methodC()

而不是尝试去做

doSomething();
method(); // which blocks waiting for the BG task to complete
doSomethingElse();

您可以将method()修改为

public final void method(final Runnable callback) {

someObject.before();

SwingWorker<Void, Void> worker1 = new SwingWorker<Void, Void>() {

protected Void doInBackground() throws Exception {
methodExt();
return null;
}

protected void done() {
someObject.after();
if(callback != null) callback.run();
}
};

worker1.execute();
}

然后将其称为

doSomething();
method(new Runnable() {
public void run() {
doSomethingElse();
}
});

现在method立即返回并且不会阻塞EDT,但是在后台任务完成后doSomethingElse仍然发生在EDT上。

关于java - 调用SwingWorker run是否有错误以及如何同步doInBackground?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28692424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com