gpt4 book ai didi

java - 线程不在 Swing 应用程序中启动

转载 作者:行者123 更新时间:2023-12-02 06:11:17 25 4
gpt4 key购买 nike

我正在开发一个相对简单的数据库管理器,它接收许多文件,以特定的方式解析和编目信息。为此我还用 Swing 编写了一个简单的 GUI。为了加快进程速度,我想对执行的可并行部分实现多线程,以加快程序速度。

下面的代码位于一个名为 FDBCreatePanel 的类中,这是一个自定义的 JPanel,它位于容纳 main 方法的 FDBManagerFrame 中。

private void dbCreateActionButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dbCreateActionButtonActionPerformed

jfc = new JFileChooser();
jfc.setVisible(true);
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = jfc.showSaveDialog(null);
((FDBManagerFrame) SwingUtilities.getRoot(this)).startProcessAnimation();

if(returnVal == JFileChooser.APPROVE_OPTION) {
new SwingWorker<Void,Void>(){
@Override
protected Void doInBackground() throws Exception {
File dir = jfc.getSelectedFile();
DbManager dbm = new DbManager(dir, dbNameField.getText());
try{
dbm.doTimeConsumingStuff();

} catch (SQLException e){
// errorhandling
}
@Override
protected void done() {
((FDBManagerFrame) SwingUtilities.getRoot(FDBCreatePanel.this)).endProcessAnimation();
}
}.execute();
}
}

DbManager 类中的耗时方法导致(除其他外)ParserType1 类中的以下代码:

private void init() {
try {
this.reader = new LineNumberReader(new FileReader(this.datfile));
Thread t = new Thread(new Runnable(){
@Override
public void run() {
Entry e;
while((e = parseNextEntry()) != null)
queue.offer(e);
}
}, "t1-parser-thread");
t.run();
} catch (FileNotFoundException e) {
// error handling
}
}

当我监视程序的执行时,我在 JVisualVM 中没有看到任何 t1-parser-thread。看起来好像我的代码完全在单个线程上执行,忽略了新线程的启动。我是否遗漏了有关线程和 Swing 的某些内容?

最佳答案

您正在 ParserType1.init() 中新创建的 Thread 对象上调用 run()。这不会启动一个新线程 - 它只是在现有线程中执行该线程的 run() 方法。您应该改为调用 start()

从根本上来说,我认为 Thread 实现 Runnable 根本就是一个错误 - “这是应该执行的代码”(Runnable )和“这就是我要执行它的方式”(Thread)不幸的是被模糊了。事实上,Thread 可以也可以组成一个Runnable,这使得情况变得更糟。

Runnable runnable = new Runnable() { ... };
Thread thread = new Thread(runnable) {
// Override run here...
};

除非您重写的 run 方法调用 super.run(),否则传递到构造函数的 Runnable 将被忽略。疯狂的事情。 Thread 应该(IMO)是最终的,而不是实现 Runnable,并且强制您在构造时提供 Runnable。不幸的是,现在改变已经太晚了:(

基本上,您应该永远线程上调用run()。至少,我不记得上次看到它是什么时候,它不是一个错误。

关于java - 线程不在 Swing 应用程序中启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21857506/

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