【问题标题】:Thread Runtime Exception Behaviour线程运行时异常行为
【发布时间】: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


【解决方案1】:

你的代码是无意义的。

  • Runnable 中的 start 方法毫无意义。它永远不会被运行Runnable 的线程调用。
  • 在传递给uncaughtException 的线程上调用Thread#start 保证会导致IllegalThreadStateException,因为该线程必须已经启动,否则它不会引发异常。

【讨论】:

  • 我没有明白你的第一点:主线程使用 myThread.start() 来调用线程的 run() 函数。最好进一步解释一下。(您可以查看tutorialspoint.com/java/java_multithreading.htm,例如我的实现) 第二点:我知道它会得到非法线程状态异常,但是不同设备的不同行为的原因是什么。对于一台设备它的工作?问题是为什么?什么时候不应该
猜你喜欢
  • 2014-08-07
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 2023-03-19
  • 2011-01-22
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多