java界面子线程界面阻塞了主线程界面怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java界面子线程界面阻塞了主线程界面怎么解决?相关的知识,希望对你有一定的参考价值。

主界面现在有一些按钮,其中包括一个文件发送按钮。我想点击文件发送按钮后,弹出另一个界面专门处理文件发送问题。但是我这里用的是TCP的方式发送文件,选择好要发送的文件后,点击发送,子界面会阻塞掉,一直等待多个接受方接受文件。这个时候子界面就不能点了,但是主界面也不能进行操作了。

我给子界面创建了一个线程,还是没有解决。

//启用子界面发送文件
jb4.addActionListener(new ActionListener()

@Override
public void actionPerformed(ActionEvent e)
// 启用服务器端发送文件界面
new FileSend().start();

);
//单独创建一个线程
private class FileSend extends Thread

@Override
public void run()
VideoServerPanel vsp=new VideoServerPanel();


    子线程做一个timeout超时

    弹出界面不要全屏,你还是可以操作主界面,对吧

    子线程提供取消按钮!\\


3种选择,你自己看看什么合适你的项目。

参考技术A 使用SwingUtilities类,提供了两个方法:invokeLate和invoteAndWait可以解决卡主的问题。 参考技术B 是不是这个VideoServerPanel本身就会阻塞主线程界面呢,我也不太懂,求解一下

CoreData从后台线程读取数据仍然阻塞UI界面的原因及解决



问题现象

大家都知道,使用CoreData读取(Fetching)大量数据会阻塞主线程,从而导致界面的卡顿。

所以,我们必须用私有队列 (privateQueueConcurrencyType) 类型的托管上下文 (NSManagedObjectContext) 在后台线程读取数据:

如上图所示,我们已经用(私有队列的)托管上下文在后台读取数据,但界面在读取时仍然会发生卡顿。

这属于CoreData使用中一个非常常见的误区,如果不是造成了卡顿(读取海量数据),大家可能都发现不了这个问题。

那么这是什么原因?又该如何解决呢?

别急,下面就让我们拨开迷雾,彻底搞清楚这个问题吧。

Let’s Go!



问题分析

1. CoreData后台读取数据的误区

CoreData中的托管对象无法保证线程安全。上面谈过,要想在后台线程读取数据,需要创建特殊的托管上下文:

let bgContext 

以上是关于java界面子线程界面阻塞了主线程界面怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

子线程频繁更新ui导致界面卡顿问题?

用QT是怎么编写后台线程,我开启了一个耗时的线程,结果界面就卡住,只有等到这个线程执行完才会做其他。

CoreData从后台线程读取数据仍然阻塞UI界面的原因及解决

android编程为啥要更新界面?怎么更新?

c#程序载入过程中显示载入等待界面怎么做

c# 多线程运行时出现主界面卡死现象如何解决?