我正在编写一个java应用程序,通过DES算法对输入进行加密和解密。首先,我在没有GUI的情况下制作它,并使用System.out.print();
在输出窗口中打印中间步骤。当输入很大时,计算可能需要一段时间,但是当使用输出窗口时,在计算时逐个打印的中间步骤。那太完美了。
现在我为我的程序制作了一个GUI,使用一个名为txtDebug的JTextArea来打印中间步骤:
public static void debug(String tekst){
txtDebug.setText(txtDebug.getText()+tekst+"\n");}
问题:中间步骤不再逐一打印。如果输入很大,程序只会冻结并且什么都不做,直到计算全部完成,然后一次打印中间步骤。
另一个问题:当我没有使用GUI时,程序永远不会崩溃,现在如果输入足够大,程序会崩溃:它会冻结,而且永远不会恢复生命。
请帮忙吗?
答案 0 :(得分:2)
您必须在后台工作线程中完成工作。在主线程中执行此操作将阻止Swing处理事件 - >用户界面将阻止。
答案 1 :(得分:2)
用户界面处于冻结状态,因为您正在对事件调度线程执行长时间运行的计算,事件调度线程负责处理事件并重新绘制UI。为避免此问题,请考虑在后台线程上执行加密/解密,可能使用SwingWorker
。
关于用户界面永远不会恢复生命的第二点,这可能表明另一个资源问题(例如,内存)。您可能希望运行探查器或JConsole以在发生此问题时查看每个线程的状态。