什么是工作线程,它与我创建的线程有什么区别?

44

我通过以下方式创建一个线程:

Thread newThread= new Thread(DoSomeWork);

.
.
.
private void DoSomeWork()
{
}

这与工作线程有什么不同吗?如果有区别...哪一个更好,我应该在什么情况下使用工作线程? 我的应用程序需要有很多线程来进行监视、刷新等操作。


1
你确定你的应用程序需要许多线程吗?你提出这个问题的事实表明你应该尝试最小化线程... - Mitch Wheat
1
我应该怎么做:我的需求 1)读取套接字并写入文件,并将值插入数据库 2)持续监视数据库并在UI屏幕上连续显示那些刷新的值(或新插入的值) - Tj.
1
Tj,如果你在标签中指明平台(C#,Java),可能会有所帮助。 - H H
4个回答

48

我试图以一种简单的方式解释这个概念,希望能帮助更好地理解“工作线程”的概念。

通用定义:

“工作线程”只是一个线程,它运行以执行某些后台工作,顺从他的上级(我们可以称之为“客户”)的命令,并将工作结果更新给客户。

技术定义:

工作线程通常被定义为在客户请求时激活的线程。

示例1:

1- 我们有一个披萨店,那里有10个专家,他们擅长准备美味的披萨。这些人被称为“工作线程”。

2- 我们有一个接受顾客订单的人。这个人被称为“客户”。每当有新的订单到来时,一个“工作线程”开始准备披萨,并在披萨准备好后向客户更新。

3- 当订单少于10个时,一些工人就会闲置下来。

4- 当订单超过10个时,订单会被放入等待队列中。

示例2:

1- 有一个应用程序服务器监听8080端口。

2- 有一个请求在8080端口上进入。

3- 监听线程(被称为“客户”)接收该请求并将其分派到完成请求的“工作线程”中。实际上,在应用程序服务器上维护了许多“工作线程”对象池。

4- 如果同时有两个请求,则分配两个工作线程,任务会同时执行。


37

通常,“工作者线程”一词用于描述在当前线程上执行工作的另一个线程,而这在许多情况下是前台或UI线程。然而,这并非铁板钉钉。

Windows程序通常使用单个“主”线程来管理UI,并且通常是同步的(即按顺序运行)。如果有长时间运行的任务需要执行,则为避免在这些类型的程序中阻塞UI,您可以使用工作者线程(可以是前台线程或后台线程)来异步执行工作,并将结果呈现给主线程以供消耗。

在Windows程序中,这是通过消息完成的。如果您使用特定的库,例如.net框架,则可用特殊的实用程序类(如ThreadPool和BackgroundWorker)来使后台或工作者线程处理更轻松。但是,您始终可以使用平台原语来实现相同的目的。


1
在Windows程序中,这是通过消息完成的。不完全正确。如果您的Windows程序在主线程中执行某些长时间操作,则会在该操作持续时间内阻止消息,除非您调用某些函数(例如WaitForSingleObject()PeekMessage())来循环解决此问题。(如果您想使用该技术,请参见此答案。)创建一个线程来执行这些长时间的进程可以避免执行这些循环。 - RobH
你误解了。最后一段是关于如何通知主要的UI(它将在最低级别上抽取窗口消息)线程从次要线程或实际上是自身。这不是关于如何在主线程上执行多任务处理的问题。第二段中次要线程的存在是为了避免阻塞UI线程。 - Preet Sangha

14

除了术语之外,我想不到什么技术上的差别。

Worker线程被称为这样是因为它们正在等待某些作业到来,并在由其他人分配作业时执行该作业。例如,Web服务器进程接收请求并将其分配给其池中的线程进行处理。该线程遵循进程并完成工作,然后返回池。在此期间,主线程将执行其他任务。

对于您的目的:

持续监视数据库以识别更新/新值是必需的。它可以只是一个线程,始终在后台运行,定期唤醒并从数据库更新UI中的值。


1

实际上有一些区别,但并不是非常明显。在微软的文档中,我没有找到"worker thread"这样的术语。在Jeffrey Richter的书(CLR via C# (Developer Reference) 4th Edition by Jeffrey Richter)中,在章节"How worker threads are managed"中有一个解释:"当非工作线程调度任务时,任务将被添加到全局队列中。但是,每个工作线程都有自己的本地队列,当工作线程调度任务时,任务将被添加到调用线程的本地队列中。"

你可以找到一些证据。如果你观察 System.Threading.ThreadPool 中的 QueueUserWorkItem 方法,你会看到它使用 forceGlobal:true 标志进行排队,并且当使用 TaskCreationOptions.PreferFairness 作为参数调用 UnsafeQueueUserWorkItemInternal 来排队任务时,ThreadPoolTaskScheduler 将被使用,其中相反的将使用 forceGlobal 标志。
Microsoft 对不同类型队列有解释:msdn

因此你可以通过不同的队列区分工作线程,但这只是针对具体线程行为的抽象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接