我正在研究这个问题的答案,并在this 帖子中发表。 ThreadPool安全吗? ThreadPool如何与OmniThreadLibrary进行比较?使用每种方法的优缺点是什么?
这是我正在做的一个例子:
procedure DoWork(nameList: TList<Integer>)
var
i: Integer;
oneThread: PerNameThread;
begin
for (i := 0; to nameList.Count-1) do
begin
oneThread := PerNameThread.Create(Self);
oneThread.nameID = nameList[i];
oneThread.Start();
end
end;
我正在为每个nameList项创建一个线程,最多可以有500个名称。所有这些线程都太多了,并且使进程变慢,只需一个线程就可以更快地完成此过程。
答案 0 :(得分:2)
首先,您需要了解线程池是什么。
线程池是一个概念,其中包含多个线程的列表,这些线程在不执行任何任务时被挂起。
这些线程的定义与您可能习惯的有点不同。他们的Execute()
方法只包含几行代码来执行外部代码(使线程能够执行几乎所有需要的处理),而不是在Execute()
方法中包含所有必需的代码。 ,负责将结果同步回调用者/ UI,并将线程返回到池并将其置于挂起状态。当稍后需要新任务时,线程被赋予该任务并恢复
因此,通过为每个线程提供一个任务的方法指针,您实际上定义了每个线程在每次运行时将处理的作业类型。
使用线程池的主要优点是这样做可以避免为每个特定任务创建和销毁线程的开销。
至于OmniThreadLibrary,它是一个完整的任务管理库。它使用自己的线程池和非常先进的任务管理系统,允许您轻松定义哪些任务可以并行执行,哪些任务需要按顺序执行,哪些任务优先于其他任务。
OmniThreadLibrary的唯一缺点是它仅限于Windows,因此如果您考虑为您的应用程序提供多平台支持,那么您将不得不寻找另一种解决方案。