Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程不在Swing应用程序中启动_Java_Multithreading_Swing - Fatal编程技术网

Java 线程不在Swing应用程序中启动

Java 线程不在Swing应用程序中启动,java,multithreading,swing,Java,Multithreading,Swing,我正在开发一个相对简单的数据库管理器,它接收大量文件,以特定的方式解析和编目信息。为此,我还在Swing中编写了一个简单的GUI。为了加速进程,我想对执行的可并行部分实现多线程,以加速程序 下面的代码位于一个名为FDBCreatePanel的类中,该类是一个自定义JPanel,位于容纳main方法的FDBManagerFrame中 private void dbCreateActionButtonActionPerformed(java.awt.event.ActionEvent evt) {/

我正在开发一个相对简单的数据库管理器,它接收大量文件,以特定的方式解析和编目信息。为此,我还在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();
    }       
}

在监视程序执行时,我在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...
};