Java Android线程id检查

Java Android线程id检查,java,android,multithreading,Java,Android,Multithreading,谷歌针对Android的gtalksms在服务中使用了一个处理程序。启动处理程序线程时,它存储线程id,然后在处理程序中进行以下检查: if (Thread.currentThread().getId() != mHandlerThreadId) { throw new IllegalThreadStateException(); } 我的问题是你为什么需要这种支票?这是好的做法还是什么?我对多线程非常陌生 编辑: 需要明确的是,这是HandlerThread: Han

谷歌针对Android的gtalksms在服务中使用了一个处理程序。启动处理程序线程时,它存储线程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))

这将检查当前线程是否与UI线程相同。我不这么认为,这是处理程序线程的线程id。处理程序没有自己的线程,它在UI线程上运行。我已经编辑了我的问题,上面的内容不显示处理程序在自己的线程上吗?