按下JButton后,我的程序的UI冻结了一段时间。我发现造成这种情况的原因是信号量堵塞了Swing线程。这是包含信号量noexcept
调用的方法:
void SetString(const std::string& val)
noexcept(std::is_nothrow_copy_assignable<std::string>::value) {
}
这是调用acquire()
private void fetch(int numThreads) {
//some code here
sem = new Semaphore(numThreads);
for (int i = 0; i < model.getRowCount(); i++){
try {
sem.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
//some code here
}
据我了解,此代码最终在Swing线程上运行fetch()
,但据推测它与Swing无关。
我想,我的问题是:如何运行一个名为&#39; ActionPerformed()&#39; Swing在程序的主线程上而不是Swing线程?
答案 0 :(得分:0)
无需专门在&#34; main&#34;线。只需在任何其他线程上运行它,但需要在Swing UI线程上运行。
到达那里的最简单的解决方案:
fetch(Integer.parseInt(threadsNumField.getText()));
放入Runnable对象遵循:
private final ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() {
public void run() {
fetch(Integer.parseInt(threadsNumField.getText()));
}
});