我有一个关于我一直在研究和寻找答案的事情的一般性问题 3 天(并且基本上已经放弃了纯粹的挫败感。)
情景1;
A) 调用方法创建并显示“请稍候..”带有 .setVisible(true) 的 JWindow 组件
B)调用方法进行简单的计算和 System.out 的结果
C)“请稍候..”在步骤 B 执行期间按预期持续存在
D) 步骤 B 终止并在“请稍候”窗口上调用 .setVisible(false) 并按预期进行
到目前为止,一切都很好。
情景2;
与场景 1 相同,只是步骤 B 中的工作要复杂得多,并调用一个自定义类,该类执行一堆数据库查询/写入,平均大约需要 3-6 秒才能完成。自定义类不可运行或线程化,只是简单地调用;
customClass cc = new customClass();
cc.makeMyDataPlease();
- 无论出于何种原因,在方案 2 中,.setVisible(true) 步骤 'A' 直到复杂的工作步骤 'B' 完成后才会发生。
我现在已经花了 2 1/2 整整一天的时间来尝试解决在本网站上找到的这些类型问题的许多解决方案,而其他人却没有运气。尝试了 swingworker、invokelater、thread 等,并得出结论,在撕掉更多头发之前,我需要对此进行更多调查。
对于连接到 URL 并发布数据的方法,我遇到了类似的问题。在网络连接例程开始之前,我试图在一个简单的 JLabel 上设置文本,但它也失败了。文本是在网络例程完成后设置的。
就好像虚拟机正在线程化每个语句执行。
我的怀疑是 mysql 类和网络 URL 类共享属性(网络?)冻结可能没有时间完成的其他任务。
这是我的问题/困惑:
如果除非创建/调用新线程,否则主 java 线程中的执行是顺序的,为什么会有任何干扰该 setVisible(true) 语句?它在逻辑上必须在执行数据库例程语句之前完成,但事实并非如此。
java中确保一个语句在下一个语句之前完全执行的最终方法是什么?(或者至少,当下一个开始时,我确信 VM 可以足够快地执行 setVisible,以至于它们甚至可以同步启动)。
提前致谢
具体来说,我的问题是;在处理与 Java 中的“阻塞器”例程相关的并发问题以及如何在这些范围内最好地工作时,最佳实践是什么。