Android线程ID检查

时间:2013-05-12 11:48:37

标签: java android multithreading

谷歌的Android版gtalksms在服务中使用了一个处理程序。当它启动处理程序线程时,它存储线程id,然后在Handler中进行以下检查:

if (Thread.currentThread().getId() != mHandlerThreadId) {
        throw new IllegalThreadStateException();
}

我的问题是你为什么需要这种检查?是好的做法还是什么?我是多线程的新手。

修改

为了清楚起见,这是HandlerThread:

    HandlerThread handlerThread = new HandlerThread("My.Service");
    handlerThread.start();
    mHandlerThreadId = handlerThread.getId();
    ServiceHandler serviceHandler = new ServiceHandler(handlerThread.getLooper());

1 个答案:

答案 0 :(得分:2)

  

为什么需要这种检查?

该语句确保该方法正在HandlerThread上运行。通常,如果对象或进程需要是单线程的,则这是检查对象是否正确使用的一种方法。如果有人从多个线程中调用它,则会出现异常。

一个常见的例子是几乎总是意味着单线程的GUI - 一些实现执行这些类型的检查以确保始终从UI线程更改UI组件。

在这种特定情况下,我不知道该库的详细信息,但我认为它在多线程环境中没有按预期运行,并且开发人员介绍了检查以禁止这样的用法。

注意:从技术上讲,两个线程不太可能具有相同的ID但不是不可能的,因此检查也可以是:if (Thread.currentThread().equals(handlerThread));