我正在研究一个相对简单的数据库管理器,它以特定的方式接收大量文件,解析和编目信息。为此,我还在Swing中编写了一个简单的GUI。为了加速进程,我想实现多线程执行的可并行化部分,以加速程序。线程无法在Swing应用程序中启动
下面的代码位于一个名为FDBCreatePanel
的类中,这是一个定制的JPanel
,它位于一个容纳主要方法的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
(S),当我监视我的程序的执行情况。看起来好像我的代码完全在单个线程上执行,忽略了新线程的启动。我是否错过了关于线程和Swing的东西?
你的'ParserType1.init'方法不会启动一个新的线程,当我怀疑你想调用'start'时,它调用'Thread'对象的'run' ... –
@JonSkeet很好的捕获...虽然我不得不问为什么'run()'和'start()'?我的意思是有什么理由为什么会调用'run()'而不是'start()' – posdef
做过线程的人犯了这个错误。;) – jeremyjjbrown