JavaFX中JNA实现的自定义WindowProcedure回调是否始终运行在应用线程?
结论
这个现象没有官方保障,不代表所有场景下都成立,你当前观测到回调始终运行在JavaFX Application Thread上,只是OpenJFX Windows平台现有实现的偶然表现。
原因说明
- 首先Windows系统本身的窗口过程回调线程规则是:如果是通过
PostMessage投递到窗口消息队列的消息,回调会运行在窗口所属的、跑消息循环的线程上;如果是其他线程通过SendMessage主动发送的消息,回调会直接运行在发起SendMessage的线程上下文。 - 目前OpenJFX的Windows端实现,确实是把JavaFX Application Thread作为窗口消息循环线程来用,所以常规系统触发的窗口消息,对应的你自定义的JNA窗口过程回调,就会跑在FX线程上,这就是你测试时
Platform.isFxApplicationThread()始终返回true的原因。
存在的例外场景
以下情况回调就不会运行在FX线程上:
- 其他原生线程、或者你自己写的JNI/JNA代码主动调用
SendMessage给绑定了自定义窗口过程的HWND发消息 - 后续OpenJFX修改Windows端底层实现,将窗口消息循环和JavaFX Application Thread解绑
最佳实践
不要依赖当前观测到的线程表现写代码:
- 如果回调里需要操作JavaFX UI组件,不管当前线程是什么,都统一用
Platform.runLater()包装UI操作 - 如果回调里有耗时处理逻辑,主动切到后台线程执行,避免阻塞消息循环导致界面无响应
内容的提问来源于stack exchange,提问作者vbyzjnlehi
相关产品推荐
相关产品推荐

