Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.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
理解java线程的名称_Java_Android_Multithreading_Android Studio - Fatal编程技术网

理解java线程的名称

理解java线程的名称,java,android,multithreading,android-studio,Java,Android,Multithreading,Android Studio,我为我的应用程序运行了此代码 Map<Thread, StackTraceElement[]> myMap = Thread.getAllStackTraces(); Log.d("threads", myMap.toString()); Map myMap=Thread.getAllStackTraces(); Log.d(“threads”,myMap.toString()); 我得到了以下结果 {Thread[pool-1-Thread-1,5,main

我为我的应用程序运行了此代码

Map<Thread, StackTraceElement[]> myMap = Thread.getAllStackTraces();
Log.d("threads", myMap.toString());
Map myMap=Thread.getAllStackTraces();
Log.d(“threads”,myMap.toString());
我得到了以下结果

{Thread[pool-1-Thread-1,5,main]=[Ljava.lang.StackTraceeElement;@e21f0dc,Thread[queued work looper,5,main]=[Ljava.lang.StackTraceeElement;@1fec5e5,Thread[FinalizerWatchdogDaemon,5,system]=[Ljava.lang.StackTraceeElement;@de438ba,Thread[process reaper,10,system]=[Ljava.lang.StackTraceeElement;@d51036b,Thread[GooglePiHandler,5,main]=[Ljava.lang.StackTraceeElement;@a4b3ec8,线程[Thread-2,3,main]=[Ljava.lang.StackTraceeElement;@5dadb61,线程[HeapTaskDaemon,5,system]=[Ljava.lang.StackTraceeElement;@7d7a51c,线程[ReferenceQueueDaemon,5,system]=[Ljava.lang.StackTraceeElement;@b0d2686,线程[FinalizerDaemon,5,system]=[Ljava.lang.StackTraceeElement;@7fa6b47,线程[main,5,5,main]=[Ljava.lang.StackTraceeElement;@2397f74}`

我认为文本
Thread[pool-1-Thread-1,5,main]
传达了非常重要的信息,但我不太清楚它的确切含义。有人能解释一下它的含义吗


更新:对于另一个应用程序,我得到了输出
{Thread[Thread-7,5,main]=..
,因此
Thread-7
似乎表示与
pool-1-Thread-1
不同的东西,所以我想了解线程的名称表示什么?

UPDATE

线程名称表示创建线程的代码的编写者所决定的内容。这个问题没有简单的答案

但是,有些名称似乎是不言自明的,例如下面格式化输出中列出的名称。例如:

  • main
    -主线程
  • Finalizer
    -负责执行
    finalize()
    方法的线程
记录了其他名称。例如,的javadoc说:

分配新的
线程
对象。此构造函数与
线程(null,null,gname)
具有相同的效果,其中
gname
是新生成的名称。自动生成的名称的形式为
“Thread-”+n
,其中
n
是一个整数

因此
Thread-7
似乎是第8次调用
new Thread(…)
创建的线程,它没有指定名称

pool-1-thread-1
这样的线程名称也将是线程池#1中的线程#1的自动生成名称


要以易于阅读的格式打印调用结果,请使用以下代码:

Map myMap=Thread.getAllStackTraces();
for(条目:myMap.entrySet()){
System.out.println(entry.getKey());
对于(StackTraceElement元素:entry.getValue())
系统输出打印项次(“+elem”);
}
示例输出(Java8)

线程[终结器,8,系统]
java.lang.Object.wait(本机方法)
remove(ReferenceQueue.java:144)
remove(ReferenceQueue.java:165)
java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
线程[附加侦听器,5,系统]
线程[信号调度器,9,系统]
线程[参考处理程序,10,系统]
java.lang.Object.wait(本机方法)
wait(Object.java:502)
java.lang.ref.Reference.tryHandlePending(Reference.java:191)
java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
螺纹[main,5,main]
java.lang.Thread.dumpThreads(本机方法)
getAllStackTraces(Thread.java:1610)
main(Test8.java:7)
示例输出(Java15)

线程[终结器,8,系统]
JAVAbase@15.0.1/java.lang.Object.wait(本机方法)
JAVAbase@15.0.1/remove(ReferenceQueue.java:155)
JAVAbase@15.0.1/remove(ReferenceQueue.java:176)
JAVAbase@15.0.1/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:170)
线程[附加侦听器,5,系统]
线程[信号调度器,9,系统]
线程[通知线程,9,系统]
螺纹[普通清洁剂,8,无害螺纹组]
JAVAbase@15.0.1/java.lang.Object.wait(本机方法)
JAVAbase@15.0.1/remove(ReferenceQueue.java:155)
JAVAbase@15.0.1/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:148)
JAVAbase@15.0.1/run(Thread.java:832)
JAVAbase@15.0.1/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:134)
螺纹[main,5,main]
JAVAbase@15.0.1/java.lang.Thread.dumpThreads(本机方法)
JAVAbase@15.0.1/getAllStackTraces(Thread.java:1649)
app//Test.main(Test.java:9)
线程[参考处理程序,10,系统]
JAVAbase@15.0.1/java.lang.ref.Reference.waitForReferencePendingList(本机方法)
JAVAbase@15.0.1/processPendingReferences(Reference.java:241)
JAVAbase@15.0.1/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:213)

Well
Thread[pool-1-Thread-1,5,main]
Thread.toString()的输出,如果您查看(并且源代码确认了这一点和提到的顺序),您将看到:name、priority和group name。在您的示例中,除“process reaper”之外的所有线程都具有优先级5,您基本上有两个组:“main”和“system”。@Thomas谢谢,这非常有帮助!所以第一个线程的名称是
pool-1-thread-1
,但在我得到的不同应用程序上运行代码时,它也应该指示其他的东西
{thread[thread-7,5,main]=[Ljava…
所以我知道名称是
Thread-7
优先级是5,但它仍然表示与
pool-1-Thread-1
不同。好的
pool-1-Thread-1
基本上只是一个名称,你可以提供你想要的任何名称,例如
新线程(“非常重要,但毫无意义的名称”)
。您从名称中获得的信息可能有意义,但不一定有意义。在您的特定情况下,我假设有