Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:Process.myTid()与Thread.currentThread().getId()的比较_Android_Android Asynctask - Fatal编程技术网

Android:Process.myTid()与Thread.currentThread().getId()的比较

Android:Process.myTid()与Thread.currentThread().getId()的比较,android,android-asynctask,Android,Android Asynctask,我有一个简单的活动调用异步任务,所以我打印了一些关于过程和线程的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 /*********************

我有一个简单的
活动
调用
异步任务
,所以我打印了一些关于
过程
线程
的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
    是相同的,因为它的
  • Pid
    类似:
    过程
  • onCreate
    中的第三行与
    Pid
    相同,因为它是
    UIThread
    ,在基于Linux的Android操作系统中,我们知道关于
    进程的问题实际上是
    线程
    等等。。。在
    Async
    中,
    ThreadId
    是不同的,因为
    AsyncTask
    运行在不同的
    Thread
    上,而不是
    UIThread
  • 我很难理解的是
    Thread.currentThread().getId()
    。我希望在相同的执行环境中获得与
    Thread.currentThread().getId()相同的id。e、 g.对于
    onCreate
    我希望第3,4行相同(29776),对于
    Async
    我希望第3,4行相同(30426)。这是怎么回事


    谢谢,

    OP提出了一个非常有趣的问题,我决定去挖掘(热爱开源)

    简单的回答是:它们之所以不同,是因为它们不同,因为它们本来就不应该是一样的

    • Process.myTid()
      是linux线程ID
    • Thread.getId()
      是一个简单的顺序
      long
      number
    但是简短的答案很无聊,所以让我们来探索答案的来源(答案中的链接指向相关的源代码)

    在中,您将看到,这只是从其本身调用本机方法,因为该方法如下所示:

    public static int gettid() { return Libcore.os.gettid(); }
    
    此外,
    Os.gettid()的文档您将找到指向的链接

    gettid()返回调用方的线程ID(TID)。在单线程中 进程,线程ID等于返回的进程ID(PID 通过getpid(2))。在多线程进程中,所有线程具有相同的 PID,但每个都有一个唯一的TID

    • 这意味着,
      Process.myTid()
      返回Linux内核给定的线程ID
    另一方面,它只是返回一个
    long
    。在
    init(…)
    as期间分配这一长度。那么这个谜题的最后一块,下面是

    • 这意味着,
      Thread.getId()
      只是一个“java层”静态变量,每个线程都会自动递增

    您从哪个
    AsyncTask
    方法记录ID?@Onik
    onCreate
    (活动)正在调用常规
    newsometask().execute()这是常规的Android
    AsyncTask
    当然!你有记录身份证吗?如果是这样,我知道您记录的方法之一是
    Activity
    onCreate()
    。另一个是什么(在
    AsyncTask
    中)?@Onik我想我明白了
    Log.e(“Tag”,getId…)
    内部
    doInBackground
    使用
    Log
    是根源吗?
    /* For generating thread ID */
    private static long threadSeqNumber;
    
    private static synchronized long More ...nextThreadID() {
        return ++threadSeqNumber;
    }