【发布时间】:2016-07-09 02:29:31
【问题描述】:
在 Android 应用中创建启动线程时,我发现了一个非常特殊的问题。
如果我有以下类线程:
public class TroubleThread extends Thread{
boolean running;
public boolean isRunning() {
return running;
}
public void setRunning(boolean running) {
this.running = running;
}
@Override
public void run() {
while (isRunning()){
}//end while
}//end run
}
并将其添加到 Activity 的 onCreate(...) 方法中,例如:
public class MyActivity extends Activity {
TroubleThread myThread;
@Override
public void onCreate(Bundle savedInstanceState) {
//....
myThread = new TroubleThread();
myThread.setRunning(true);
myThread.start();
}
}
应用会崩溃。
但如果我将 run() 方法更改为:
@Override
public void run() {
while (running){ //NOTE THE USE OF DIRECT FIELD ACCESS INSTEAD OF METHOD
}//end while
}//end run
它不会崩溃。
即使我通过使用锁、notify() 和 wait() 解决了我的问题,问题仍然存在:
为什么当使用直接访问该字段时,应用程序继续工作,而当使用该方法时它崩溃?
【问题讨论】:
-
您是使用
boolean running;而不是Boolean running吗?你能发布堆栈跟踪吗? -
您是否尝试过初始化该值以使
getRunning()肯定返回某些内容而不是未初始化的变量?另外,这里问的问题是什么,您似乎已经修复了崩溃...? -
你的错误是什么?
-
没有任何堆栈跟踪?
-
我认为问题不是你的TroubleThread,而是UI线程,它可能正在等待需要大量时间的东西。我已经通过直接访问布尔值和通过 get 方法测试了您的解决方案,它工作正常。因此,我认为这应该取决于您在 UI 线程中尝试执行的操作。但是,您可能只需要同步对共享变量的访问即可。
标签: java android multithreading