为什么主线程被阻止

时间:2014-12-22 11:51:58

标签: java multithreading thread-safety concurrent-programming

任何人都可以告诉我为什么以下发布的代码会阻止主线程吗?

loadFile方法启动一个工作线程,该线程加载一个巨大的日志文件,可能需要10秒才能加载。当我运行程序时,负责启动文件线程的按钮冻结,直到加载文件并且文件线程完成其工作。

此外,在三行中跟随loadFile方法的调用,我试图显示类似“loading ....”的内容,并且只要文件未加载或其线程尚未完成工作,我用额外的点显示相同的文本“正在加载......”,直到文件线程/工作线程终止。

请告诉我为什么下面的代码会阻塞主线程,以及如何实现显示文本通知用户文件仍在加载文本末尾的额外点。

我希望我的问题很明确。

if ( (this.client != null) &&  (this.client.isConnected()) ) {
            System.out.println("Client is connected to a broker.");
            statusarea.append(Log.w(TAG, "preLoadSystemChecks", "Client Connected") + "\n");
            loadFile();
            StringBuilder sb = new StringBuilder(".");
            statusarea.append(Log.i(TAG, "preLoadSystemChecks", "Loading measurements file.") + "\n");
            statusarea.append(Log.i(TAG, "preLoadSystemChecks", "Loading" + sb) + "\n");
            while ( (this.fileThread != null) && (this.fileThread.getState() != State.TERMINATED) ) {
                sb.append(".");
            }

的LoadFile()

protected void loadFile() throws MqttException {
    // TODO Auto-generated method stub
    statusarea.append(Log.d(TAG, "loadFile", "File is loaded") + "\n");
    if (this.fileThread == null) {
        fileThread = new Thread(fileProcessinRunnable, FILE_THREAD);
        fileThread.start();
    }
}

1 个答案:

答案 0 :(得分:2)

您的while循环阻塞主线程,直到加载程序线程终止:

while ( (this.fileThread != null) && (this.fileThread.getState() != State.TERMINATED) ) {
    sb.append(".");
}

(请注意,只需在StringBuilder上添加一个点就不会导致任何地方显示任何内容。)