在java冻结中打印中间步骤

时间:2011-11-02 17:01:27

标签: java debugging swing freeze concurrency

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

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

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

问题:中间步骤不再逐一打印。如果输入很大,程序只会冻结并且什么都不做,直到计算全部完成,然后一次打印中间步骤。

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

请帮忙吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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