Android中如何获取线程ID?调用Thread.currentThread().getId()返回相同ID的问题
问题核心原因
你对Thread.currentThread().getId()的功能理解是正确的,也没有误用这个API——输出两处相同ID的结果,根源是启动线程的方式写错了,根本没创建新线程。
Thread类的run()方法只是一个普通的覆写实例方法,直接调用它不会触发新线程的创建和系统调度,方法体内的所有代码会直接在当前调用线程里同步顺序执行。- 你在UI线程的
onCreate中新建Thread实例后,直接调用了该实例的run()方法,相当于把Runnable内部的逻辑拉回UI线程同步执行,此时Thread.currentThread()获取到的仍然是原来的UI线程,两处输出的ID自然完全一致。 - 要真正创建并启动独立的新线程,必须调用
Thread实例的start()方法:该方法会向系统申请创建独立的执行流,待系统完成线程调度后,才会自动回调你在run()方法中写的业务逻辑。
代码修正示例
你原代码中的错误片段:
// 错误写法:直接调用run(),全程在UI线程执行 new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getId()); // line b } }).run();
修正后的正确写法:
// 正确写法:调用start()触发新线程创建 new Thread(new Runnable() { @Override public void run() { // 此处代码运行在独立新线程中,输出的ID与UI线程不一致 System.out.println(Thread.currentThread().getId()); // line b } }).start();
关于
Thread.currentThread().getId()的补充说明 - 这个API本身的作用就是返回当前执行流所在线程的唯一数字标识,从JDK 1.5引入,Android全版本均支持。
- 容易踩的认知误区:
Runnable本质只是一个任务载体,本身不具备启动线程的能力,只有将其绑定到真正通过start()启动的Thread实例上,任务代码才会在独立线程中执行。 - 版本适配提示:Android 8.0(API 26,对应Android Build.VERSION_CODES.O)开始,
Thread.getId()返回值从int类型改为long类型,跨版本开发时需要注意类型适配。
内容的提问来源于stack exchange,提问作者Richard Hu
相关产品推荐
相关产品推荐

