2011-04-21 49 views
6

在JNI本地方法,有沒有辦法知道當前線程的ID,而無需調用Java回來了?線程本地存儲也可以工作。NDK/JNI:識別當前線程

編輯:pthread.h出現在NDK包括文件夾...有誰知道,如果Java線程對應POSIX那些在NDK實施?

回答

5

哪個ID是你感興趣的? Dalvik線程轉儲包括:

"main" prio=5 tid=1 TIMED_WAIT 
    | group="main" sCount=1 dsCount=0 obj=0x40017730 self=0x12798 
    | sysTid=3167 nice=0 sched=0/0 cgrp=default handle=-2146114456 
    | schedstat=(358850000 275073000 869) utm=23 stm=12 core=0

「tid」是VM的ID。 「句柄」是pthread_t。 「sysTid」 是gettid()(在Linux進程ID)的結果。

的libcore線程ID(從java.lang.Thread.getId獲得())未示出。輸出到由dalvik.vm.stack-trace-file屬性(通常爲/ data/anr/traces)定義的公共文件。 txt,但它因設備而異)。

編輯:每個Dalvik VM線程都是Linux pthread。 gettid()系統調用會爲每個線程提供一個唯一的ID。此外,您可以在java.lang.Thread或pthread_key中向TLS添加標識信息。

+0

我最感興趣的是有一些不應該在主線程以外的線程上執行的操作。如果(!(當前正在執行的JNI方法正從工作Java線程調用)){主線程只有位}。 – 2011-04-22 18:38:36

+0

虛擬機不會給予「主」線程任何優惠待遇。你可以通過檢查gettid()== getpid()來得到一個近似值,即它是Linux進程的主線程,但這是不能保證的,並且可能在將來中斷。更好的計劃是讓應用程序UI線程在線程本地存儲(java.lang.Thread或pthread TLS)中設置一個值並檢查它。 – fadden 2011-04-25 20:07:36

+1

所以java.lang.Threads * DO *對應並行線程?謝謝。將知識的核心轉移到你的答案中,我會接受。亞行的指導與我無關 - 我試圖通過編程來實現。 – 2011-04-25 20:13:59