Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中的执行_Java_Multithreading_Swing - Fatal编程技术网

如何使用线程挂起java中的执行

如何使用线程挂起java中的执行,java,multithreading,swing,Java,Multithreading,Swing,我已经通过编程创建了一个向导。它包含3个面板。第二种是德维西潘,第三种是德维斯潘。第三个面板由一个进度条组成。我想让我的程序在显示第三个面板后启动一个函数process()?可以使用线程吗 else if(ParserMainDlg.this.POSITION==1){ if(sqlConnectionPane.executeProcess()==true){ devicePane.setDeviceList();

我已经通过编程创建了一个向导。它包含3个面板。第二种是德维西潘,第三种是德维斯潘。第三个面板由一个进度条组成。我想让我的程序在显示第三个面板后启动一个函数
process()
?可以使用线程吗

else if(ParserMainDlg.this.POSITION==1){
    if(sqlConnectionPane.executeProcess()==true){    
        devicePane.setDeviceList();                             
         ParserMainDlg.this.POSITION++;
         fireStateChanged(oldValue);
    }
}
else if(ParserMainDlg.this.POSITION==2){
    System.out.println("position:"+ParserMainDlg.this.POSITION);
    if(devicePane.executeProcess()==true){
         ParserMainDlg.this.POSITION++;
         fireStateChanged(oldValue);    
    }

我想
sqlConnectionPane.executeProcess()
调用在显示devicePane面板后开始执行的函数?

您可以明确使用线程执行任务,这是处理长时间运行任务的首选方法

这里有多个选项。所有选项都包括回调向导以更新进度条

您可以创建自己的任务类来完成此任务,也可以使用现有的任务类。“SwingWorker本身是一个抽象类;您必须定义一个子类才能创建SwingWorker对象;匿名内部类通常对创建非常简单的SwingWorker对象非常有用。”

使用我们刚刚了解的swing worker,您可以使用以下内容:

SwingWorker<Integer, Integer> backgroundWork = new SwingWorker<Integer, Integer>() {

        @Override
        protected final Integer doInBackground() throws Exception {
            for (int i = 0; i < 61; i++) {
                Thread.sleep(1000);
                this.publish(i);
            }

            return 60;
        }

        @Override
        protected final void process(final List<Integer> chunks) {
            progressBar.setValue(chunks.get(0));
        }

    };

    backgroundWork.execute();
SwingWorker backgroundWork=新SwingWorker(){
@凌驾
受保护的最终整数doInBackground()引发异常{
对于(int i=0;i<61;i++){
睡眠(1000);
本章第1节出版;
}
返回60;
}
@凌驾
受保护的最终作废流程(最终列表块){
progressBar.setValue(chunks.get(0));
}
};
backgroundWork.execute();

请注意,您必须将任务分解为更小的部分,才能真正显示进度

请格式化您的代码。如果在JOptionPane或其他模式对话框中显示devicePanel,则始终可以在代码中立即开始执行流程。否则,您必须使用某种类型的侦听器。查找一个选项以集成
SwingWorker
。没有人知道需要多长时间
sqlConnectionPane.executeProcess()
+1除了一点:您可能希望将progressBar更新到最后一个块,而不是第一个块。整数列表中始终只有一项,因为每次迭代只发布一个整数:)使用第一个还是最后一个并不重要。还值得注意的是,progressBar需要在edt上更新!“出于性能目的,所有这些调用都合并到一个带有串联参数的调用中。例如:publish(“1”);publish(“2”、“3”);publish(“4”、“5”、“6”);可能导致:process(“1”、“2”、“3”、“4”、“5”、“6”)“您是对的,先生,我站在更正位置!