Java 线程不在Swing应用程序中启动
我正在开发一个相对简单的数据库管理器,它接收大量文件,以特定的方式解析和编目信息。为此,我还在Swing中编写了一个简单的GUI。为了加速进程,我想对执行的可并行部分实现多线程,以加速程序 下面的代码位于一个名为Java 线程不在Swing应用程序中启动,java,multithreading,swing,Java,Multithreading,Swing,我正在开发一个相对简单的数据库管理器,它接收大量文件,以特定的方式解析和编目信息。为此,我还在Swing中编写了一个简单的GUI。为了加速进程,我想对执行的可并行部分实现多线程,以加速程序 下面的代码位于一个名为FDBCreatePanel的类中,该类是一个自定义JPanel,位于容纳main方法的FDBManagerFrame中 private void dbCreateActionButtonActionPerformed(java.awt.event.ActionEvent evt) {/
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();
}
}
在监视程序执行时,我在JVisualVM中没有看到任何
t1解析器线程。似乎我的代码完全在单个线程上执行,而忽略了新线程的启动。我是否遗漏了一些关于穿线和摆动的内容 正如Jon指出的,您希望调用start()方法来实际生成一个新线程,该线程将调用内联Runnable的run方法。如果只调用run,它就像调用任何其他方法一样,将在同一线程中执行
}, "t1-parser-thread");
t.start();
您正在ParserType1.init()
中对新创建的线程对象调用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
将被忽略。疯狂的东西<代码>线程(IMO)应该是最终的,而不是实现Runnable
,并强制您在构建时提供Runnable
。现在改变已经太晚了,不幸的是:(
基本上,您不应该调用run()
在线程上
。至少,我不记得上一次看到它是什么时候了,因为它不是一个bug。你的ParserType1.init
方法不会启动新线程。它在线程
对象上调用运行
,当时我怀疑你想调用启动
。@jonsket漂亮的捕获…非常尴尬的错误就我而言。虽然我不得不问为什么run()
和start()
?我的意思是,有没有任何理由会调用run()
,而不是start()
,大多数执行线程的人都犯了这个错误。@posdef:让线程实现可运行是一个设计错误,依我看:(@JonSkeet我明白了……谢谢你的洞察力和答案!如果你能把你的两条评论重新整理成一个答案,我可以接受,因为你是第一个回答这个问题的人。:)否则,如果你不介意的话,我就接受jeremyjjbrown的回答有趣的是,我认为这肯定是关键问题,但我现在正在运行一个测试,“t1解析器线程”不见了,即使在t.start()
之后。。。Peculiar@posdef:也许它开始了,但很快就结束了?
Runnable runnable = new Runnable() { ... };
Thread thread = new Thread(runnable) {
// Override run here...
};