java - Android 线程 ID 检查

标签 java android multithreading

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

最佳答案

why would you need this type of check?

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

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

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

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

关于java - Android 线程 ID 检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16507035/

相关文章:

Java:如何分割字符串而忽略其他部分

java - 将 little Endian 文件转换为 big Endian

android - 奇怪的异常——java.lang.RuntimeException : mBaselineAlignedChildIndex of LinearLayout set to an index that is out of bounds

c# - 调用 Web 服务异步

c++ - 解释 gperftools 在多线程工作负载上的结果

c++ - 有什么方法可以知道线程使用了多少内存?

java - Bukkit - 从 PHP 文件获取响应

java - IntelliJ(访问被拒绝)

android - 如何使用 ACRA 发送 Android 崩溃报告

android - 如何将 float 操作按钮转换为具有相关操作的菜单