任何人都可以告诉我为什么以下发布的代码会阻止主线程吗?
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();
}
}
答案 0 :(得分:2)
您的while
循环阻塞主线程,直到加载程序线程终止:
while ( (this.fileThread != null) && (this.fileThread.getState() != State.TERMINATED) ) {
sb.append(".");
}
(请注意,只需在StringBuilder
上添加一个点就不会导致任何地方显示任何内容。)