当我开始用java计算时,为什么我的java GUI会冻结

当我开始用java计算时,为什么我的java GUI会冻结,java,swing,event-dispatch-thread,concurrency,Java,Swing,Event Dispatch Thread,Concurrency,我正在开发一个java应用程序 但当我开始处理我的申请时,我的申请被冻结了 因此,我可以在此过程中更新我的GUI 你们知道怎么解决这个问题吗 谢谢您的回复 伙计们,我已经尝试过了,但它仍然冻结了GUI 这是我的密码 final String key = keywords; final int dept = dep; final double rele = relevance; SwingWorker worker = new SwingWorke

我正在开发一个java应用程序

但当我开始处理我的申请时,我的申请被冻结了

因此,我可以在此过程中更新我的GUI

你们知道怎么解决这个问题吗

谢谢您的回复

伙计们,我已经尝试过了,但它仍然冻结了GUI

这是我的密码

final String key = keywords;
        final int dept = dep;
        final double rele = relevance;

        SwingWorker worker = new SwingWorker<Map, Void>() {
            @Override
            public Map doInBackground() {
                final Map resultMap = focusedCrawlingMain.Search(key, dept, rele);  

                return resultMap;
            }

            public void Done(Map dataMap) {
                final List resultList = (List) dataMap.get("relevantList");
                List resultListValue = (List) dataMap.get("relevantListScore");
                int size = resultList.size();

                newData = new String[size][3];
                for(int i = 0; i < size; i++){
                    newData[i][0] = String.valueOf(i+1);
                    newData[i][1] = String.valueOf(resultList.get(i));
                    newData[i][2] = String.valueOf(resultListValue.get(i));
                    model.addRow((new Object[]{newData[i][0],newData[i][1],newData[i][2]}));
                }
            }
        };
        worker.run();
最终字符串键=关键字;
最终int dep=dep;
最终双相关=相关性;
SwingWorker worker=新SwingWorker(){
@凌驾
公共地图doInBackground(){
最终地图结果Map=focusedCrawlingMain.Search(关键字、部门、版本);
返回结果图;
}
公共作废完成(映射数据映射){
最终列表resultList=(List)dataMap.get(“relevantList”);
List resultListValue=(List)dataMap.get(“relevantListScore”);
int size=resultList.size();
newData=新字符串[大小][3];
对于(int i=0;i
您可以在GUI主线程之外的单独线程中执行计算。这里,您可以看一看,其中还包括在swing应用程序中执行多线程处理时应注意的不同事项。

您可以在一个独立的线程中执行计算,而不是在主GUI线程中执行计算。下面是您可以了解的内容,其中还包括在swing应用程序中执行多线程处理时应注意的不同事项。

您需要了解。

您需要了解。

我相信worker.run()可能会引起一些麻烦。如果我没有误解您的代码,您应该实际调用worker.execute()

此外,将“完成”方法中的尽可能多的计算移到“完成背景”。Done方法在事件分派线程上执行,这会冻结GUI,在运行长时间计算时尤其明显。

我相信worker.run()可能会引起一些问题。如果我没有误解您的代码,您应该实际调用worker.execute()


此外,将“完成”方法中的尽可能多的计算移到“完成背景”。Done方法在事件分派线程上执行,这会冻结GUI,尤其是在运行长时间计算时。为什么这不是一个真正的问题?在我看来,这似乎是一个非常好的问题,但它可能已经被问过很多次了。@Carlo:我真的不太了解SwingWorker thingy,但为什么不按照Darin Dimitrov的建议,从主方法开始一个新线程,并在该线程中执行计算,这样就不会让GUI冻结。Regards@GagandeepBali因为我不知道如何使用多线程,你能给我演示一下吗?@Carlo:只需创建一个实现Runnable的新类,然后在它的run方法中进行计算。在main方法中,编写以下线程threadName=new Thread(new CalculationClass());threadName.start();我想那就行了。Regards@GagandeepBali在main方法中,编写以下线程threadName=newthread(。当涉及到Swing时,start()是错误的(或者至少只是故事的一半):最后,必须更新ui的属性,并且必须在EDT上进行更新。这就是SwingWorker提供帮助的地方,因为它允许干净地分离后台线程和EDT,并管理从前者到后者的通信为什么这不是一个真正的问题?在我看来,这似乎是一个非常好的问题,但它可能已经被问过很多次了。@Carlo:我真的不太了解SwingWorker thingy,但为什么不按照Darin Dimitrov的建议,从主方法开始一个新线程,并在该线程中执行计算,这样就不会让GUI冻结。Regards@GagandeepBali因为我不知道如何使用多线程,你能给我演示一下吗?@Carlo:只需创建一个实现Runnable的新类,然后在它的run方法中进行计算。在main方法中,编写以下线程threadName=new Thread(new CalculationClass());threadName.start();我想那就行了。Regards@GagandeepBali在main方法中,编写以下线程threadName=newthread(。当涉及到Swing时,start()是错误的(或者至少只是故事的一半):最后,必须更新ui的属性,并且必须在EDT上进行更新。这正是SwingWorker提供帮助的地方,因为它允许干净地分离后台线程和EDT,并管理从前者到后者的通信。好的问题:-)问题中的另一个小问题:Done从不调用,因为它没有覆盖任何超级方法…好的捕获:-)问题中的另一个小问题:Done永远不会被调用,因为它没有覆盖任何超级方法。。。