【问题标题】:Printing intermediate steps in java freezes在java中打印中间步骤冻结
【发布时间】:2011-11-02 17:01:26
【问题描述】:

我正在编写一个通过 DES 算法加密和解密输入的 java 应用程序。首先,我在没有 GUI 的情况下制作了它,并使用 System.out.print(); 在输出窗口中打印了中间步骤。当输入很大时,计算可能需要一段时间,但是当使用输出窗口时,中间步骤会在计算时一个一个地打印出来。那太完美了。

现在我为我的程序制作了一个 GUI,使用名为 txtDebug 的 JTextArea 来打印中间步骤:

public static void debug(String tekst){
txtDebug.setText(txtDebug.getText()+tekst+"\n");}

问题:中间步骤不再一一打印。如果输入很大,程序就会冻结,什么也不做,直到计算完成,然后它会一次性打印所有中间步骤。

另一个问题:当我不使用 GUI 时,程序从来没有崩溃过,现在如果输入足够大,程序就会崩溃:它会冻结并且永远不会恢复。

有什么帮助吗?

【问题讨论】:

    标签: java debugging swing freeze concurrency


    【解决方案1】:

    您必须在后台工作线程中完成工作。在主线程中执行此操作将阻止 Swing 处理事件 -> UI 将阻塞。

    【讨论】:

    • 感谢您的回复,我已经阅读了有关 SwingWorker 但我不确定如何实现它,这是我的程序的结构:我有一个 Functions.java,其中包含所有用于加密和解密的函数,2 个类 Encryption.java 和 Decryption.java,它们从 Functions.java 调用正确的函数,我有一个 Main.java 类,它包含 GUI 和动作处理程序并调用 Encrypt.java 或 Decrypt.java .我还在 Main.java 中添加了一个函数,以便 Encrypt.java 和 Decrypt.java 可以将调试信息写入 txtDebug。哪些类需要扩展 SwingWorker?
    • 无; SwingWorker 是一个实用程序类。请参阅 JavaDocs 中的示例(我的答案中的第二个链接)。见download.oracle.com/javase/tutorial/uiswing/concurrency/…
    • 谢谢,我现在在 Encrypt 类中使用 SwingWorker 在后台进行计算,计算完成后,我会在我的 GUI 中打印中间步骤。现在还有另一个问题:没有 GUI,我的程序计算速度非常快,每秒大约 100 次迭代。使用 GUI 和 SwingWorker,我的程序每秒只计算 1 次迭代。这是怎么发生的?
    • UI 需要很多周期。每秒仅更新 3-4 次(使用 System.currentTimeMillis() 确定您上次更新 UI 的时间)。
    【解决方案2】:

    用户界面卡住了,因为您正在事件调度线程上执行长时间运行的计算,该线程负责处理事件和重新绘制 UI。为避免此问题,请考虑在后台线程上执行加密/解密,可能使用SwingWorker

    关于用户界面永远不会恢复活力的第二点,这可能表明另一个资源问题(例如内存)。发生此问题时,您可能需要运行分析器或 JConsole 来查看每个线程的状态。

    【讨论】:

    • 感谢您的回复,我已经阅读了有关 SwingWorker 但我不确定如何实现它,这是我的程序的结构:我有一个 Functions.java,其中包含所有用于加密和解密的函数,2 个类 Encryption.java 和 Decryption.java,它们从 Functions.java 调用正确的函数,我有一个 Main.java 类,它包含 GUI 和动作处理程序并调用 Encrypt.java 或 Decrypt.java .我还在 Main.java 中添加了一个函数,以便 Encrypt.java 和 Decrypt.java 可以将调试信息写入 txtDebug。哪些类需要扩展 SwingWorker?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2022-10-24
    • 2017-04-19
    相关资源
    最近更新 更多