Google针对Android的gtalksms在服务内使用了Handler。当启动处理程序线程时,它将存储线程ID,然后在处理程序中进行以下检查:

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());

最佳答案

为什么需要这种类型的支票?


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

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

在这种特定情况下,我不知道该库的详细信息,但我想它在多线程环境中的行为不符合预期,因此开发人员引入了该检查以禁止这种用法。

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

10-06 05:56