控制台文本输出被阻止,即使它在另一个线程上

时间:2013-02-08 23:31:59

标签: java multithreading

我有一个非常复杂的Java程序。它工作正常。但是我想在应用程序中打印一个“工作”动画,让用户知道应用程序是否有响应。我创建了一个简单的类,其代码如下:

public class Working extends Thread {
    private volatile boolean finished = false;
    char[] animationChars = new char[] { '|', '/', '-', '\\' };
    int anim = 0;

    public void finish() {
        finished = true;
    }

    public void run() {
        try {
            while (!finishing) {
                print();
            }
        } catch (Exception e) {
            // nothing here...
        }
    }

    private void print() throws InterruptedException {
        for (int i = 0; i < SLEEP_SECS; i++) {
            System.out.print("\rWorking... " + animationChars[anim++]);
            if (anim == 4)
                anim = 0;
            Thread.sleep(1000);
        }
    }
}

当我运行它时,一开始它工作正常。但随着时间的推移,有些情况下动画会停止几秒钟。我将此代码移动到另一个线程会解决这个问题,但正如您所看到的,它没有!

我的项目访问数据库,运行命令行进程并下载很多页面。是什么导致了这个问题?我错过了什么,或者Java无法处理这么简单的任务。

1 个答案:

答案 0 :(得分:0)

我怀疑这些停止是在一个完整的gc期间,因为一个完整的gc可能会阻止世界释放一些内存(如果你没有使用parellel gc)。 你应该检查gc日志。