草庐IT

安卓:Process.myTid() VS Thread.currentThread().getId()

coder 2023-12-25 原文

我有一个调用 AsyncTask 的简单 Activity,所以我打印了一些关于 ProcesThread 的 id:

From onCreate android.os.Process.myUid(): 10137
From onCreate android.os.Process.myPid(): 29776
From onCreate android.os.Process.myTid(): 29776
From onCreate Thread.currentThread().getId(): 1
/****************************************************************/
From Async doInBackground android.os.Process.myUid(): 10137
From Async doInBackground android.os.Process.myPid(): 29776
From Async doInBackground android.os.Process.myTid(): 30426
From Async doInBackground Thread.currentThread().getId(): 12556
  1. Uid 相同,因为它是 app-specific sandbox
  2. 类似于Pid:Each app is one 流程
  3. onCreate 中的第 3 行与 Pid 相同,因为它是 UIThread 并且在基于 Linux 的 Android 操作系统中我们知道关于 Process 实际上是 Thread 等...而在 AsyncThreadId 是不同的,因为 AsyncTask 在不同的 Thread 而不是 UIThread
  4. 上运行

我很难理解的是 Thread.currentThread().getId()。我期望的是在相同的执行环境中获得与 Thread.currentThread().getId() 相同的 id。例如对于 onCreate,我希望第 3,4 行相同 (29776),对于 Async,我希望第 3,4 行相同 (30426)。这是怎么回事?

谢谢,

最佳答案

OP 提出的非常有趣的问题,我决定深入挖掘(热爱开源)。

简短的回答是:它们之所以不同,是因为它们不同,因为它们本来就不是相同的。

  • Process.myTid()为linux线程ID
  • Thread.getId() 是一个简单的连续 long 数字。

但是简短的答案很无聊,所以让我们探索一下答案的来源(答案中的链接指向相关的源代码)。

Process.myTid() ,您会看到这只是来自 Os.gettid() 的调用它本身在 Libcore 上调用本地方法该方法如下:

public static int gettid() { return Libcore.os.gettid(); }

此外还有 Os.gettid(); 的文档,您会找到指向 Linux Programmer's Manual 的链接

gettid() returns the caller's thread ID (TID). In a single-threaded process, the thread ID is equal to the process ID (PID, as returned by getpid(2)). In a multithreaded process, all threads have the same PID, but each one has a unique TID.

  • 这意味着,Process.myTid() 返回 Linux 内核给定的线程 ID。

另一方面Thread.getId()只是返回一个long。此 long 在 init(...) 期间分配为 tid = nextThreadId(); .然后是这个拼图的最后一 block ,下面是 nextThreadId() 的代码

/* For generating thread ID */
private static long threadSeqNumber;

private static synchronized long More ...nextThreadID() {
    return ++threadSeqNumber;
}
  • 这意味着,Thread.getId() 只是一个“java 层”静态长期为每个线程自动递增。

关于安卓:Process.myTid() VS Thread.currentThread().getId(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33171734/

有关安卓:Process.myTid() VS Thread.currentThread().getId()的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - Rails : Before process_action callback :authenticate_user! 尚未定义 - 2

    我正在创建一个包含设计的Rails应用程序。我正在尝试使用Ngrok将Twilio消息传递添加到我的站点,我使用了本教程:https://www.twilio.com/blog/2016/04/receive-and-reply-to-sms-in-rails.html我能够在控制台中打开Ngrok并获取他们为我的网址提供的网络ID。当我将url插入浏览器时,我不断收到此错误。我应该访问我自己的Rails本地应用程序。不知道怎么了。我在为ngrok制作的消息传递Controller中添加的内容:classMessagesController"reply"defreplymessage_

  3. ruby - 需要帮助理解 ruby​​ 的 Process.detach - 2

    我正在通过ruby​​学习系统编程,但我无法理解这种行为:pid=forkdoSignal.trap("USR1")doputs"hello!"endSignal.trap("TERM")doputs"Terminating"exitendloopdoendendProcess.detach(pid)Process.kill("USR1",pid)Process.kill("USR1",pid)Process.kill("USR1",pid)Process.kill("USR1",pid)Process.kill("TERM",pid)如我所料输出:hello!hello!hello!

  4. ruby - Windows 上有哪些 Process.kill 信号可用? - 2

    来自Process.kill的文档:Sendsthegivensignaltothespecifiedprocessid(s)ifpidispositive.IfpidiszerosignalissenttoallprocesseswhosegroupIDisequaltothegroupIDoftheprocess.signalmaybeanintegersignalnumberoraPOSIXsignalname(eitherwithorwithoutaSIGprefix).Ifsignalisnegative(orstartswithaminussign),killsproces

  5. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

  6. ruby-on-rails - Ruby 1.9.2 中的 Process.fork 和 Process.spawn 有什么区别 - 2

    Ruby1.9.2中的Process.fork和新的Process.spawn方法有什么区别,哪个更适合在子进程中运行另一个程序?据我了解,Process.fork接受代码块,而Process.spawn接受系统命令和其他一些参数。什么时候应该使用一个而不是另一个? 最佳答案 What'sthedifferencebetweenProcess.forkandthenewProcess.spawnmethodsinRuby1.9.2Process.fork允许您在另一个进程中运行ruby​​代码。Process.spawn允许您在另一

  7. javascript - Node 子进程, channel 在 process.send 上关闭 - 2

    在我的工作文件中,我监听数据回调。someLib是Node串口。process.on('message',function(msg){someLib.on('data',function(data){console.log('somedata');process.send(data);});});这打印somedataError:channelclosed但是process.on('message',function(msg){process.send('foobar');});工作正常。这很奇怪,但有时第一个代码示例有效,所以channel关闭错误随机出现。来自http://node

  8. javascript - 为 Shiny 应用程序添加 'Calculation In Process' 指示器 - 2

    我正在使用shiny构建网络应用程序。有些步骤需要一些时间来计算,所以我想在Shiny的应用程序中添加一个进程指示器中的计算。我找到了ShowthatShinyisbusy(orloading)whenchangingtabpanels在stackoverflow中,但是shinyIncubator包seams需要指定最小值和最大值。然后我找到了这个博客:http://withr.me/blog/2014/01/03/add-calculation-in-process-indictor-for-shiny-application/他提供了一个很好的方法来做到这一点。shinyUI(b

  9. javascript - 出现错误 - 调试连接已关闭。原因 : Render process gone - 2

    我正在制作游戏,但最终它会停止工作。似乎没有任何韵律或原因,不确定我是否有内存泄漏或类似的问题?在我插入大量数组之前,我是从一个在线托管的json文件中提取它的。直到我完成游戏后才在控制台中显示消息。“调试连接已关闭。原因:渲染进程消失了。”不管是firefox还是chrome。由于点击按钮很重,似乎如果我点击的速度不那么快,它就会运行。#myScore{position:fixed;right:5px;width:220px;border:0pxsolid#555555;padding:10px;}#myContainer{width:736px;height:736px;posit

  10. javascript - 当 process.env.NODE_ENV= ='production' 时,使用 babel-polyfill 在 IE11.0.9600 中未定义 fetch 和 Headers - 2

    当process.env.NODE_ENV=='development'-没问题!但是我们的生产构建在IE11(11.0.9600)中失败了。在chrome55中一切正常。开发依赖:...babel-core:"6.22.0",babel-eslint:"^7.0.0",babel-loader:"^6.2.5",babel-preset-env:"^1.5.2",babel-preset-es2015:"^6.16.0",babel-preset-es2016:"^6.22.0",babel-preset-es2017:"^6.16.0",babel-preset-react:"^6

随机推荐