我有一个调用 AsyncTask 的简单 Activity,所以我打印了一些关于 Proces 和 Thread 的 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
Uid 相同,因为它是 app-specific sandbox Pid:Each app is one 流程onCreate 中的第 3 行与 Pid 相同,因为它是 UIThread 并且在基于 Linux 的 Android 操作系统中我们知道关于 Process 实际上是 Thread 等...而在 Async 中 ThreadId 是不同的,因为 AsyncTask 在不同的 Thread 而不是 UIThread 我很难理解的是 Thread.currentThread().getId()。我期望的是在相同的执行环境中获得与 Thread.currentThread().getId() 相同的 id。例如对于 onCreate,我希望第 3,4 行相同 (29776),对于 Async,我希望第 3,4 行相同 (30426)。这是怎么回事?
谢谢,
最佳答案
OP 提出的非常有趣的问题,我决定深入挖掘(热爱开源)。
简短的回答是:它们之所以不同,是因为它们不同,因为它们本来就不是相同的。
Process.myTid()为linux线程IDThread.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/
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我正在创建一个包含设计的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_
我正在通过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!
来自Process.kill的文档:Sendsthegivensignaltothespecifiedprocessid(s)ifpidispositive.IfpidiszerosignalissenttoallprocesseswhosegroupIDisequaltothegroupIDoftheprocess.signalmaybeanintegersignalnumberoraPOSIXsignalname(eitherwithorwithoutaSIGprefix).Ifsignalisnegative(orstartswithaminussign),killsproces
快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目
Ruby1.9.2中的Process.fork和新的Process.spawn方法有什么区别,哪个更适合在子进程中运行另一个程序?据我了解,Process.fork接受代码块,而Process.spawn接受系统命令和其他一些参数。什么时候应该使用一个而不是另一个? 最佳答案 What'sthedifferencebetweenProcess.forkandthenewProcess.spawnmethodsinRuby1.9.2Process.fork允许您在另一个进程中运行ruby代码。Process.spawn允许您在另一
在我的工作文件中,我监听数据回调。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
我正在使用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
我正在制作游戏,但最终它会停止工作。似乎没有任何韵律或原因,不确定我是否有内存泄漏或类似的问题?在我插入大量数组之前,我是从一个在线托管的json文件中提取它的。直到我完成游戏后才在控制台中显示消息。“调试连接已关闭。原因:渲染进程消失了。”不管是firefox还是chrome。由于点击按钮很重,似乎如果我点击的速度不那么快,它就会运行。#myScore{position:fixed;right:5px;width:220px;border:0pxsolid#555555;padding:10px;}#myContainer{width:736px;height:736px;posit
当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