java中线程子类获取当前线程的引用时,线程子类调用Thread.currentThread()方法的疑问,谢谢大神。

java中线程子类获取当前线程的引用时,线程子类调用Thread.currentThread()方法的疑问,谢谢大神。,第1张

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

先看下api上如此写:

currentThread

public static Thread currentThread()

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

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

后端进程中按任务分为多种不同的线程池。专门有一个接受任务的线程,这个线程与线程池之间有缓存队列,当有任务来时,按任务的类型存放到不同缓存中,当缓存中有任务时,会通过信号量通知线程池中的线程处理任务。这时线程池中当前没有空闲线程,该任务会留在缓存中等待被处理。正在被线程处理的任务需要设置超时时间,避免新的任务不能被处理。或者动态新增线程数目,等任务增长的速度慢了后,在将线程池中的数量回退到初始值。

inline void WaitStopThreadNoDeadLock(CWinThread dwThread, HWND hWnd){

if(dwThread == NULL)

return;

HANDLE hThread = dwThread->m_hThread;

if(hThread == NULL)

return;

if(WaitForSingleObject(hThread, 500) != WAIT_OBJECT_0)

{

if(TerminateThread(hThread, 55)==55)

{

delete hThread;

hThread=NULL;

}

}

}

    在进行多线程编程中 比较重要也是比较困难的一个 *** 作就是如何获取线程中的信息 大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中 然后再提供一个获取方法将这个字段的内容返回给该方法的调用者 如以下的ReturnThreadInfo类

  package threadtest ;/ @author shi mingxiang/public class ReturnThreadInfo extends Thread {private String str;public ReturnThreadInfo() {this str = Hello ;}public void run(){this str = Hello World! ;}public String getThreadInfo(){return this str;}}

    大家可以看到该类是一个线程类并含有一个初始值为 Hello 的字段str以及一个可以返回str值的方法 getThreadInfo() 而且当这个线程启动后str会被赋于新值 Hello World! 现在我想在另外一个类中启动ReturnThreadInfo线程 并通过getThreadInfo()方法获取值为 Hello World! 的变量并打印输出到控制台中 以下给出一个实现该功能的Main类

 package threadtest ;/ @author shi mingxiang/public class Main{public Main() {}/ @param args the mand line arguments /public static void main(String[] args) {ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo();returnThreadInfo start(); //创建并启动ReturnThreadInfo线程System out println(returnThreadInfo getThreadInfo()); //获取并输出returnThreadInfo对象的str的值}}

lishixinzhi/Article/program/Java/gj/201311/27710

楼主可能对多线程还不是很熟悉。首先要处理大量数据必须放到除主线程外的其他工作线程中来处理,这样才能响应界面的点击、刷新、更新进度条等等。也就是说主线程是用来创建窗体、更新窗体等用户界面 *** 作的。

下面是转载的别人的,这样的资料太多了,其实仔细看看资料,其实很简单。

参考资料里面的内容很详细。

一、线程简介

通常C# 程序具有一个线程。这个线程从 Main方法的执行开始启动到Main方法的执行结束时线程终止。Main 直接或间接执行的每一个命令都由默认线程(或主线程)执行,当 Main 返回时此线程也将终止。不过,可以创建辅助线程,以便与主线程一起并行执行代码。这些线程通常称为“辅助线程”。

辅助线程可以用于执行耗时较多的任务或时间要求紧迫的任务,而不必占用主线程。例如,辅助线程经常用在服务器应用程序中,以便无需等待前面的请求完 成即可响应传入的请求。辅助线程还可用于在桌面应用程序中执行“后台”任务,以便使主线程(用于驱动用户界面元素)保持对用户 *** 作的响应。

多线程处理解决了吞吐量和响应性的问题,但同时也带来了资源共享问题,如死锁和争用状态。多线程特别适用于需要不同资源(如文件句柄和网络连接)的任务。为单个资源分配多个线程可能会导致同步问题,线程会被频繁阻止以等待其他线程,从而与使用多线程的初衷背道而驰。

常见的策略是使用辅助线程执行不需要大量占用其他线程所使用的资源的、耗时较多的任务或时间要求紧迫的任务。实际上,程序中的某些资源必须由多个线程访问。考虑到这些情况,SystemThreading 命名空间提供了用于同步线程的类。这些类包括 Mutex、Monitor、Interlocked、AutoResetEvent 和 ManualResetEvent。

您可以使用这些类中的部分或所有类来同步多个线程的活动,但是某些多线程处理支持由 C# 语言提供。例如,C# 中的 Lock 语句通过隐式使用 Monitor 来提供同步功能。

二、线程的生命周期

三、与线程有关的类

与C#有关的类都在SystemThreading命名空间中, SystemThreading 命名空间提供一些使得可以进行多线程编程的类和接口。除同步线程活动和访问数据的类(Mutex、Monitor、Interlocked、AutoResetEvent 等)外,此命名空间还包含一个 ThreadPool 类(它允许用户使用系统提供的线程池)和一个 Timer 类(它在线程池线程上执行回调方法)。

1 Thread: 创建并控制线程,设置其优先级并获取其状态。其中最常用的几个方法如下:

Sleep():将当前线程阻塞指定的毫秒数。

Abort():在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。

Join():阻塞调用线程,直到某个线程终止时为止。

Start():使线程得以按计划执行。

注意Suspend()为挂起线程和Resume()为继续挂起的线程,这两个方法存在风险,所以不建议使用。具体请参照MS的相关文档

Thread类的常用属性如下:

CurrentThread: 获取当前正在运行的线程。

IsAlive: 获取一个值,该值指示当前线程的执行状态。

Name: 获取或设置线程的名称

Priority:获取或设置一个值,该值指示线程的调度优先级。

ThreadState:获取一个值,该值包含当前线程的状态。

2 ThreadPool:提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。

BindHandle:将 *** 作系统句柄绑定到 ThreadPool。

GetAvailableThreads:检索由 GetMaxThreads 方法返回的最大线程池线程数和当前活动线程数之间的差值。

GetMaxThreads: 检索可以同时处于活动状态的线程池请求的数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用

GetMinThreads: 检索线程池在新请求预测中维护的空闲线程数。

QueneUserWorkItem: 将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。

RegisterWaitForSingleObject: 注册正在等待 WaitHandle 的委托。

UnsafeQueueUserWorkItem: 注册一个等待 WaitHandle 的委托。

SetMaxThreads: 设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。

四、示例及其说明

using System;

using SystemThreading;

public class Worker

{

// 在线程启动时此方法将被调用

public void DoWork()

{

while (!_shouldStop) // 如果线程正在运行则打印信息

{

ConsoleWriteLine("worker thread: working");

}

ConsoleWriteLine("worker thread: terminating gracefully");

}

public void RequestStop()

{

_shouldStop = true;

}

// Volatile这个关键字用来提醒编译器这个数据成员将被多线程访问

private volatile bool _shouldStop; // 应该停止

}

public class Program

{

static void Main()

{

// 创建一个线程对象 这里并不是线程的开始

Worker workerObject = new Worker();

// 这里定义一个新的线程,注意这里没有使用ThreadStart委托

// 另外构造函数接受的是对象的方法的名称

Thread workerThread = new Thread(workerObjectDoWork);

// 这里才是线程的真正开始

workerThreadStart();

ConsoleWriteLine("主线程: worker线程开始");

// 循环直到线程被激活,Thread的IsAlive这个属性表示线程是否为活动的

while (!workerThreadIsAlive);

// 将主线程暂停1毫秒,以允许worker这个线程完成自己的工作

ThreadSleep(1);

// 需要worker这个线程自动停止

workerObjectRequestStop();

// 使用Join这个方法来阻塞当前线程,直到对象的线程终止 workerThreadJoin();

ConsoleWriteLine("main thread: Worker thread has terminated");

}

}

GetThreadId 根据线程句柄得到线程ID。

GetWindowThreadProcessId ,根据窗口句柄得到此窗口所在线程的ID(也同时得到进程的ID)

OpenThread,能根据ID得到线程的句柄。

c# >

有个办法是你每次请求使用代理来>

以上就是关于java中线程子类获取当前线程的引用时,线程子类调用Thread.currentThread()方法的疑问,谢谢大神。全部的内容,包括:java中线程子类获取当前线程的引用时,线程子类调用Thread.currentThread()方法的疑问,谢谢大神。、线程池如何取线程去执行任务的、VC使用线程句柄获取线程的执行状态的API(挂起还是正在运行)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9516688.html

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

发表评论

登录后才能评论

评论列表(0条)

保存