如何获取一个线程的所属模块

如何获取一个线程的所属模块,第1张

在一个线程出现异常行为时,比如说CPU占用率过高,抛出异常等,你一定想知道这个线程是由哪个模块创建的。因此无论在哪个 *** 作系统上,获取线程名称是诊断线程相关问题的重要一步。 从线程ID获取线程名称通常的方法是,先获取该线程的入口地址

其实你问的应该是为什么直接写Thread。

先看下api上如此写:

currentThread

public static Thread currentThread()

返回对当前正在执行的线程对象的引用。

可见这时个静态方法,你这么理解更好点:你在哪个线程调用的我(currentThread),我就给你返回哪个线程。跟父子其实没有关系的,你在父中调用我,我就返回你说的父线程,你在子调用我就返回子线程,你在main主线程调用,我就返回主线程。也就是说你cpu正在运行哪个线程。如图:

您好,很高兴为您解答。

Map map=ThreadgetAllStackTraces();

Systemoutprintln(mapsize());

把这两句话放在需要的方法里里,运行就可以得到结果了。

下面这句话是java api的解释:

Thread类。

getAllStackTracespublic static Map<Thread,StackTraceElement[]> getAllStackTraces()返回所有活动线程的堆栈跟踪的一个映射。映射键是线程,而每个映射值都是一个 StackTraceElement 数组,该数组表示相应 Thread 的堆栈转储。返回的堆栈跟踪的格式都是针对 getStackTrace 方法指定的。

在调用该方法的同时,线程可能也在执行。每个线程的堆栈跟踪仅代表一个快照,并且每个堆栈跟踪都可以在不同时间获得。如果虚拟机没有线程的堆栈跟踪信息,则映射值中将返回一个零长度数组。

如果有安全管理器,则通过 RuntimePermission("getStackTrace") 权限和 RuntimePermission("modifyThreadGroup") 权限调用其 checkPermission 方法,查看是否可以获得所有线程的堆栈跟踪。

希望以上信息对你有帮助。

如果用多线程的话,相直接获取是没有办法的,因为这个程序是在另一个线程中执行的,当前线程会不等它执行完,就把后面的代码执行掉了

变通的方法,把这个方法执行的结果赋值给一个静态变量,然后读取这个静态变量的值~~~

如果有多个值,你可以把这些值放到一到静态的数组或是hashtable中~~~

其实你这个思路是错误的:

根据你的说明,你是想在每个页面都有去执行这个方法,而且还要获取结果。

1、这个线程和你的当前页面不在同一个线程,当前页面并不知道你这个ThreadTryRequest在别的线程中是什么样的状态,当前页面的代码也不会等你这个这个线程执行完就执行掉了,所以你不可能马上拿到这个线程的值的。

2、你这个应用,明显不该用异步的线程来执行,如果要用同步模式,我不知道你这个是为了什么目的把它放到线程中执行,因为你用同步模式,你想等这个线程的执行结果,等的时间和在页面顺序执行是一样的甚至更多~~~

你可以说一下你的目的是什么吗? 就你的描述来看,你根本没必要用线程。。。

从你的代码来看,你可能是想提高页面打开速度,把执行慢的代码放到线程中执行。。。 如果从这个思路来看是对的,不过光这样可不用,你还得用缓存,把执行结果放到缓存中再由线程或是线程池来维护。。。

总之,在一个页面中执行这么低效率的代码,整个解决方案就有问题。。。

===================================================================

public string ThreadTryRequest(string strUrl, string parm)

{

Thread thrOne = new Thread(thisThreadProc); //创建线程

ThreadParameter parameter = new ThreadParameter(); //实例化ThreadParameter对象,并赋值

parameterStrUrl = strUrlToString();

parameterparm = parmToString();

thrOneStart(parameter); //开启线程

return strState; //返回字符串

}

你想在这里就获取到值 那是获取不到的 return strState; 执行了

thisThreadProc(parameter) 还没执行完了,这个时候strState 还没被赋值,

所以我说你的思路是错误的

你想当时就知道一个线程的执行结果,除非你等~~~ 要不获取不到的~~~

c# ThreadPool 判断子线程全部执行完毕的四种方法 1、先来看看这个 多线程编程 多线程用于数据采集时,速度明显很快,下面是基本方法,把那个auto写成采集数据方法即可。 using System; using SystemCollectionsGeneric; using SystemText; u

delphi

function GetThreadsList(dwProcessId: DWORD; out hList: Tlist): Boolean;

type

PThreadsInfo = ^TThreadsInfo;

TThreadsInfo = record

dwThreadID : dword;

dwUsage : dword;

Priority : dword;

end;

var

hSnapShot: THandle;

ThreadsInfo : PThreadsInfo;

ThreadEntry32: TThreadEntry32;

begin

hList := TListCreate;

hListClear;

hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

ThreadEntry32dwSize := Sizeof(TThreadEntry32);

Result := Thread32First(hSnapShot, ThreadEntry32);

while Result do begin

if dwProcessId = ThreadEntry32th32OwnerProcessID then

try

New(ThreadsInfo);

with ThreadsInfo^, ThreadEntry32 do begin

dwThreadID := th32ThreadID;

dwUsage := cntUsage;

Priority := tpBasePri;

end;

hListAdd(ThreadsInfo);

finally

end;

Result := Thread32Next(hSnapShot, ThreadEntry32);

end;

end;

c++

void FillThreadList(CMyListCtrl &lstCtrl)

{

/if (m_dwProcessID <= 0)

{

return;

}/

//清空列表

lstCtrlDeleteAllItems();

//创建进程映像快照

HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

if (hSnap == NULL)

{

AfxMessageBox("创建线程映像快照失败!");

return;

}

THREADENTRY32 th = {0};

thdwSize = sizeof(THREADENTRY32);

//检索系统中第一个进程快照信息

if (!Thread32First(hSnap, &th))

{

AfxMessageBox("查找进程线程失败!");

}

else

{

CString txtBasePri, txtThreadID, txtHThread, txtCntUsage;

do

{

if (thth32OwnerProcessID == m_dwProcessID)

{

txtThreadIDFormat("%d", thth32ThreadID);

txtBasePriFormat("%d", thtpBasePri);

txtCntUsageFormat("%d", thcntUsage);

txtHThreadFormat("%08X", thth32OwnerProcessID);

lstCtrlAddItem(txtThreadID, txtHThread, txtBasePri, txtCntUsage);

ZeroMemory(&th, 0);

thdwSize = sizeof(THREADENTRY32);

}

}

while (Thread32Next(hSnap, &th));//检索系统中的下一个进程快照信息

lstCtrlAutoSize();

txtBasePriFormat("ProcessThreadManager - [线程数:%d]", lstCtrlGetItemCount());

SetWindowText(txtBasePri);

}

CloseHandle(hSnap);

}

C# 改怎么写总该明白了吧,

获得线程ID 下步该干什么?

function OpenThread( dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwThreadId: DWORD): THandle; stdcall;

打开线程,获取句柄,或者直接暂停 启动

百度贴吧档次太低了 你想找答案换个地方吧。。。回答问题的人基本都是文不对题,人家问怎么获取程序中的线程,你管他那么多,管他干什么呢~

以上就是关于如何获取一个线程的所属模块全部的内容,包括:如何获取一个线程的所属模块、java中线程子类获取当前线程的引用时,线程子类调用Thread.currentThread()方法的疑问,谢谢大神。、怎样获取线程池中工作线程的数量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9746754.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存