python获取线程名称,Runnable 怎么获取线程的名字

1,Runnable 怎么获取线程的名字获取线程名字这件事情本质上和Runnable是没有关系的 。一个Runnable可以给多个线程去运行,所以如果在这个概念上你有误解的话 , 希望重新考虑一下 。另外,在任何时候,你都可以用Thread.currentThread().getName()来获取当前线程的名字一般都是在run方法里面放置一个标记,来结束线程:public class case implements runnablepublic static boolean isstop = false; @override public void run()while(!isstop)//do.....} }}修改isstop为true就结束了线程
2 , 怎么获得线程IDRequirementsClient Requires Windows Vista.Server Requires Windows Server 2008 or Windows Server 2003.Header Declared in Winbase.h; include Windows.h.Library Use Kernel32.lib.DLL Requires Kernel32.dll.===========================================确实是只有2003 2008 vista能用楼主可以试一下Thread32First和CreateToolhelp32Snapshot和Thread32Next 另外,还可以注入DLL,然后用GetCurrentThreadId来取还有种方法就是用调试函数来调用该进程,也可以取你想要的线程ID不过我觉得第一种访问容易实现,对该进程也没有影响
3 , 如何获得线程对象获得Thread对象得到线程1,线程都有自己默认的名称通过getName()方法获?。?2,局部的变量在每个线程中都有独立的一份,此处应该是跟线程安全有关~后续再继续看这部分内容;class TestThread extends ThreadTestThread (String name)super(name);//继承父类的设置线程名字的构造函数}public void run()for(int i=0;i<10;i++)System.out.println(Thread.currentThread().getName()+"...is runing"+i);//其中 Thread.currentThread() 是获取当前线程,而getName()就是获取当前线程的名称}}}其中在使用这个类构造线程对象时,使用构造函数 TestThread(String name)传入的name就是为线程设置的名字,使用getName()就可以获取到设置的这个名字【python获取线程名称,Runnable 怎么获取线程的名字】
4,如何获取python 的线程id# -*- coding: utf-8 -*-import threadingimport threadimport timeclass Test(object): def __init__(self): # threading.Thread.__init__(self) self._sName = "machao" def process(self): #args是关键字参数 , 需要加上名字,写成args=(self,...threading.active_count()return the number of thread objects currently alive. the returned count is equal to the length of the list returned by enumerate().active_count可以返回当前活动的线程枚举我一般是这么用的def getheatsparallel(self):threads = []for i in range(0, self.threadcount):t = threading.thread(target=self.somefunction, name=str(i))threads.append(t)t.start()for t in threads:t.join()5,如何从线程ID获取线程名称在一个线程出现异常行为时,比如说CPU占用率过高,抛出异常等,你一定想知道这个线程是由哪个模块创建的 。因此无论在哪个操作系统上,获取线程名称是诊断线程相关问题的重要一步 。从线程ID获取线程名称通常的方法是,先获取该线程的入口地址,然后枚举进程内所有已加载模块,最后判断线程入口地址落在哪个加载模块范围内 。枚举进程内已加载模块可用Win32标准的CreateToolhelp32Snapshot/Module32First/Module32Next系列ToolHelp API得到 。获取线程入口地址则没有线程的Win32 API可用 。不过在Windows NT based操作系统上(包括Windows NT 4.0/2000/XP/2003,等),有一个未公开的Native API可用:NtQueryInformationThread 。其声明如下:DWORDWINAPINtQueryInformationThread(HANDLEThreadHandle,THREAD_INFORMATION_CLASSThreadInformationClass,PVOIDThreadInformation,ULONGThreadInformationLength,PULONGReturnLength);获取线程入口地址可用:DWORDGetThreadStartAddress(DWORDdwThreadId)DWORDretaddr,len,error;retaddr=len=0;error=NtQueryInformationThread(hThread,9,&retaddr,sizeof(retaddr),&len);CloseHandle(hThread);if(error!=0)retaddr=0;returnretaddr;}在Windows CE上就没这么幸运了,没有任何现成的API可用 。官方Windows CE Base Team的blog对这个问题的回答是可以用Remote Kernel Tracker,不过这需要你build一个特殊的kernel image,enable一些profiler功能-这在显示的问题诊断中显然是不实际的 。那么有没有办法不需要什么特殊的配置就可像Windows桌面操作系统那样获得入口地址呢?有是有的,不过需要一些hack手段 。仔细研究CE下的Thread内核数据结构,就会发现Thread结构中有一项是记录线程入口地址的 。typedefstructThread而且,在Windows CE下,线程ID和其handle的值是一样的?。∫虼宋颐强梢孕匆桓稣庋暮酉叱蘄D拿到入口地址:DWORDGetThreadStartAddress(DWORDdwThreadId){DWORDdwStartAddress=0;BOOLfOldMode=SetKMode(TRUE);PTHREADpTh=HandleToThread((HANDLE)dwThreadId);if(pTh){dwStartAddress=(DWORD)MapPtrToProcess((LPVOID)pTh-dwStartAddr,pTh-pOwnerProc-hProc);}returndwStartAddress;}为了使用这些内核数据结构,我们还需要另外一些辅助结构和函数,比较完整的代码如下 。当然,官方肯定是不建议这么做的,但是重要的是解决问题 , 你说呢 。typedefstructProcess{DWORD_1[2];HANDLEhProc;/*08:handleforthisprocess,neededonlyforSC_GetProcFromPtr*/}PROCESS,*PPROCESS;typedefstructThread{DWORD_1[3];PPROCESSpProc;/*0C:pointertocurrentprocess*/PPROCESSpOwnerProc;/*10:pointertoownerprocess*/DWORD_2[18];DWORDdwStartAddr;/*5c:threadPCatcreation,usedtogetthreadname*/DWORD_3[10];}THREAD,*PTHREAD;/*Thread*/typedefstructcinfo{characName[4];/*00:objecttypeIDstring*/uchardisp;/*04:typeofdispatch*/uchartype;/*05:apihandletype*/ushortcMethods;/*06:#ofmethodsindispatchtable*/constPFNVOID*ppfnMethods;/*08:ptrtoarrayofmethods(inserveraddressspace)*/constDWORD*pdwSig;/*0C:ptrtoarrayofmethodsignatures*/PPROCESSpServer;/*10:ptrtoserverprocess*/}CINFO;/*cinfo*/typedefCINFO*PCINFO;typedefstruct_HDATAHDATA,*PHDATA;struct_HDATA{DWORD_1[2];/*00:linksforactivehandlelist*/HANDLEhValue;/*08:Currentvalueofhandle(nonce)*/DWORDlock;/*0C:accessinformation*/DWORDref;/*10:referenceinformation*/constCINFO*pci;/*14:ptrtoobjectclassdescriptionstructure*/PVOIDpvObj;/*18:ptrtoobject*/DWORDdwInfo;/*1C:extrahandleinfo*/};/*20:sizeof(HDATA)*/#ifdefx86structKDataStruct{LPDWORDlpvTls;/*0x000Currentthreadlocalstoragepointer*/HANDLEahSys[NUM_SYS_HANDLES];/*0x004Ifthismoves,changekapi.h*/DWORD_1[4];ulonghandleBase;/*0x094baseaddressofhandletable*/};/*KDataStruct*/#endif#ifdefARMstructKDataStruct{LPDWORDlpvTls;/*0x000Currentthreadlocalstoragepointer*/HANDLEahSys[NUM_SYS_HANDLES];/*0x004Ifthismoves,changekapi.h*/DWORD_1[6];ulonghandleBase;/*0x09chandletablebaseaddress*/};/*KDataStruct*/#endif#defineHandleToThread(h)((THREAD*)GetObjectPtrByType((h),SH_CURTHREAD))#defineHANDLE_ADDRESS_MASK0x1ffffffcvoidh2p(HANDLEh,PHDATA&phdRet){if((ulong)h<NUM_SYS_HANDLES+SYS_HANDLE_BASE&&(ulong)h=SYS_HANDLE_BASE)h=((KDataStruct*)PUserKData)-ahSys[(uint)h-SYS_HANDLE_BASE];if(h){phdRet=(PHDATA)(((ulong)h&HANDLE_ADDRESS_MASK)+((KDataStruct*)PUserKData)-handleBase);if(phdRet-hValue!=h)phdRet=0;}elsephdRet=0;}PVOIDGetObjectPtrByType(HANDLEh,

    推荐阅读