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,但是这个线程上没有人给出这样的答案。特有的