Windows客户端中有时候会出现界面操作卡死,卡慢的问题,大多数情况是因为当前进程的主线程,即UI线程太繁忙,不能及时响应用户的操作。这种情况下,需要定位繁忙的逻辑所在,给主线程减压。给主线程减压的方法可以增加工作线程,将繁忙的任务抛给工作线程来做,结果交给主线程去做刷新。最近在做IM,遇到一个情况,网络上抛过来的消息量太大,可能一秒钟就有上千条数据,主线程根本来不及绘制,即便主线程只是绘制,这个线程也已经达到了100%。所以根本无暇处理用户操作。对于这种情况,需要增加缓存,将消息缓存下来,再以一定的速率交给主线程绘制,保证主线程可以及时响应用户操作。这里因为消耗的慢,缓存的快,会涉及到缓存大小和丢弃的策略。如果缓存量实在大,可以考虑本地缓存,sqlite或者本地文件作为中转存储。
系统卡顿,当系统中的繁忙的线程数等于CPU的核心数时系统就会有卡顿,因为这些线程每一个都会消耗足额的时间片。但是系统这个时候不会完全卡死,这是因为操作系统的调度策略,不会让一个线程完全占据CPU,会以优先级和时间片为纬度调度其他线程。假设CPU有12个核心,这时候起一个进程开启12个死循环线程,模拟线程繁忙的状态那么总的CPU利用率就已经是100%了。但是系统中的其他线程还会被调度,不过整个系统就会开始卡慢,因为其他线程被调度的间隔变大。繁忙等待的线程越多,这个线程越明显,如果是1000个死循环线程,那么系统就会整个卡住。假设一个线程的时间片是20ms,那么任何一个线程需要等待的时间就是1000*20ms = 20s。这个系统就无法响应了。