Java 为什么主线程被阻塞

Java 为什么主线程被阻塞,java,multithreading,thread-safety,concurrent-programming,Java,Multithreading,Thread Safety,Concurrent Programming,有人能告诉我为什么下面发布的代码会阻塞主线程吗 loadFile方法启动一个工作线程,加载一个可能需要10秒才能加载的大型日志文件。当我运行程序时,负责启动文件线程的按钮会冻结,直到文件被加载,文件线程完成其工作 另外,在调用loadFile方法之后的三行中,我试图显示类似“加载…”的内容,只要文件未加载或其线程尚未完成工作,我就会显示相同的文本“加载…”,并加上额外的点,直到文件线程/工作线程终止 请让我知道为什么下面的代码阻塞了主线程,以及如何实现显示文本通知用户文件仍在加载,文本末尾有额外

有人能告诉我为什么下面发布的代码会阻塞主线程吗

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

另外,在调用
loadFile
方法之后的三行中,我试图显示类似“加载…”的内容,只要文件未加载或其线程尚未完成工作,我就会显示相同的文本“加载…”,并加上额外的点,直到文件线程/工作线程终止

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

我希望我的问题是清楚的

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(".");
            }
加载文件()

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();
    }
}

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

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

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

@NPE请参阅所需的方法posted@rmaik:不运行等待循环?@rmaik:嗯,您有一个
while
循环,它除了阻止主线程外,没有任何用处,你在问如何避免阻塞主线程。我的建议是删除(无用的)循环。@NPE,但是这个线程上没有人给出这样的答案。特有的