【发布时间】:2018-03-28 16:42:16
【问题描述】:
我已经编写了一个带有 Runnable 类的线程,如下所示
class myThread implements Runnable {
public void start () {
thread = new Thread(this, threadName);
thread.setUncaughtExceptionHandler(handler)
thread.start()
}
@Override
run(){
while(toggle) {
try {
//do something
} catch {
throw new Runtime Exception()
}
}
}
处理程序定义在另一个类中
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable exception) {
toggle = false
try {
thread.start();
} catch (Exception e) {
// Exception in thread
}
try {
thread.join(200);
} catch (InterruptedException e) {
}
if (!thread.isAlive()){
// Tell Everyone Thread is Dead
} else {
System.out.println("Thread is still Alive ");
}
}
});
当我在华为手机中实现这个时,它工作正常,thread.start,使运行函数到达它的结尾,线程死了。但在三星平板电脑中,即使在 Handler 线程中的 thread.join 之后仍然活着。
问题:为什么不同设备性能不一致,API和Android版本相同
问题:抛出 Runtime Exception 后线程到底发生了什么?
注意:在三星平板电脑中,thread.start excpetion 是 IllegalThreadException
【问题讨论】:
-
我认为这里的主要问题是你为什么要通过尝试重新启动它来对 running 线程抛出的异常做出反应?
-
@M.Prokhorov 实际上这是第二个问题:抛出运行时异常是否确保线程已经死亡?因为即使抛出异常,thread.isAlive 也会返回 true。
-
在线程终止之前调用未捕获的异常处理程序,
UnhaughtExceptionHandler类的 Javadoc 证明了这一点。你的代码不应该依赖任何特定的线程状态,处理程序应该做它打算做的事情:处理异常。不重新启动线程。不要试图用它来join(也可能会阻止过程中的内部管理)。不对外报告。所以,问题是:你为什么需要这些?您实际上想解决什么 XY 问题? -
@M.Prokhorov,我正在创建一个新线程来读取蓝牙传感器。如果我得到一个 inputStream 异常,我希望我的 UI 知道该线程已死。这就是我在回调 UI 之前检查线程状态的原因。
-
问题是你让你的应用陷入了不应该打扰你的概念。线程是否已死,尤其是在 Android 上,与您的应用程序无关。如果您想要某种消息传递,请执行消息传递,而不是线程状态管理。
标签: java android multithreading runtimeexception