引入:數組
上篇文章講解了分類:內存管理,如今講線程類操做的接口。
jvm
分類2:線程類操做ide
a.GetThreadState.獲取線程狀態線程
jvmtiError GetThreadState(jvmtiEnv* env, jthread thread, jint* thread_state_ptr)
你們都知道線程有不少種狀態,好比Alive,Terminated,Runnable, 等待進入Synchronize Block,Waiting,Sleeping,Parked,Suspended,Interrupted等。對象
它入參thread表示要查詢的線程,返回thread_state_ptr表示線程狀態。
接口
b.GetAllThreads.獲取全部活着的線程,這些線程必須是鏈接到當前VM而且Alive的。
內存
jvmtiError GetAllThreads(jvmtiEnv* env, jint* threads_count_ptr, jthread** threads_ptr)
它返回threads_count_ptr表示活着的線程數量,返回threads_ptr表示活着的線程的引用數組。it
c.SuspendThread.掛起某線程內存管理
jvmtiError SuspendThread(jvmtiEnv* env, jthread thread)
一旦掛起某線程,則對應方法沒法返回直到另外有某個線程調用ResumeThread.io
它入參thread表示要掛起的線程。
d.SuspendThreadList.掛起一組線程
jvmtiError SuspendThreadList(jvmtiEnv* env, jint request_count, const jthread* request_list, jvmtiError* results)
一旦在ThreadList中某線程被掛起,則只有其餘某線程調用ResumeThreadList或者ResumeThread後,此線程對應方法才能夠返回。
入參request_count表示要掛起的線程數量,request_list,表示要掛起的線程數組,返回results表示掛起結果。
e.ResumeThread.恢復某個被掛起的線程
jvmtiError ResumeThread(jvmtiEnv* env, jthread thread)
f.ResumeThreadList.恢復某個被掛起的線程組
jvmtiError ResumeThreadList(jvmtiEnv* env, jint request_count, const jthread* request_list, jvmtiError* results)
g.StopThread.殺死某線程
jvmtiError StopThread(jvmtiEnv* env, jthread thread, jobject exception)
h.InterruptThread.中斷某線程
vmtiError InterruptThread(jvmtiEnv* env, jthread thread)
i.GetThreadInfo.獲取某線程信息
typedef struct { char* name; jint。 priority; jboolean is_daemon; jthreadGroup thread_group; jobject context_class_loader; } jvmtiThreadInfo;jvmtiError GetThreadInfo(jvmtiEnv* env, jthread thread, jvmtiThreadInfo* info_ptr)
從這裏能夠看出,這裏能夠獲取線程的名字,優先級,是否守護線程,所屬線程組,上下文加載器等信息。
j.GetOwnerMonitorInfo.獲取線程擁有的監視器(能夠多個)信息
jvmtiError GetOwnedMonitorInfo(jvmtiEnv* env, jthread thread, jint* owned_monitor_count_ptr, jobject** owned_monitors_ptr)
我在這裏對Monitor的理解是線程持有的鎖,也就是synchronized所關聯的對象。
入參還是給定線程,返回監視器的數量和監視器引用的數組。
k.GetCurrentContendedMonitor.獲取線程當前的監視器。
jvmtiError GetCurrentContendedMonitor(jvmtiEnv* env, jthread thread, jobject* monitor_ptr)
和上面配套使用。由於多個競爭者同時共享某線程,那麼確定有某個當前競爭者佔用了此線程的執行。
l.SetThreadLocalStorage.VM設置一個thread-local的值來關聯到某 環境-線程對。
jvmtiError SetThreadLocalStorage(jvmtiEnv* env, jthread thread, const void* data)
m.GetThreadLocalStorage.Agent來獲取爲某線程設置的thread-local值。
jvmtiError GetThreadLocalStorage(jvmtiEnv* env, jthread thread, void** data_ptr)