1. 概要
如果大家写过GUI程序或者写过Android的都知道这类程序至少会分为UI线程和Background线程.UI线程中不能做耗时时间长的事件,但是更新UI上元素的时候只能在UI线程上操作,所以写这类程序都会涉及不停的UI线程和Background线程的切换.如果在UI线程上执行耗时过长的操作会导致界面卡顿或者假死等问题.
2. IDEA插件中线程规则
Idea中与代码相关的数据结构都是由一个单一的读写锁进行控制,如果需要访问以下数据必须要在读写锁范围内进行:
读取数据
IDEA插件允许所有线程上对 相关数据进行读取,如果在UI线程中读取不需要任何额外操作,但是如果在非UI线程中需要使用ApplicationManager.getApplication().runReadAction() 进行包裹执行
- 注意 runReadAction() 尽量控制在最小的范围,尽量避免操作影响到其它线程对数据的读取
修改和写数据
写数据只能通过UI线程进行写操作,并且写的时候还是需要通过ApplicationManager.getApplication().runWriteAction() 进行包裹的
如果你需要从非UI线程中进行数据写入操作需要调用 ApplicationManager.getApplication().invokeLater()
- 注意 runWriteAction() 尽量控制在最小的范围,尽量避免操作影响到其它线程对数据的写入
- 注意 invokeLater() 尽量控制在最小的范围, 尽量避免对UI线程影响
后台执行操作
使用ProgressManager 可以进行后台长时间执行的动作
3. 检测手段
可以通过安装IDEA 的Thread插件,在断点的时候可以看到当前线程状态以及是否可以进行数据的读写