线程池安全吗?是否推荐使用它们?

Are thread pools safe and is use of them recommended?

我正在 this post 研究这个问题和 运行 的答案。线程池安全吗? 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 个名称。所有这些线程都太多了,并且减慢了进程,以至于只有一个线程这个进程会更快。

首先,你需要了解什么是线程池。

线程池是一个概念,其中包含多个线程,这些线程在不执行任何任务时被挂起。

这些线程的定义与您可能习惯的有所不同。他们的 Execute() 方法中没有所有必要的代码,他们的 Execute() 方法只包含几行代码来执行外部代码(使线程能够执行您需要的几乎任何处理) ,负责将结果同步回 caller/UI,并将线程返回到池中并将其置于挂起状态。当稍后需要一个新任务时,一个线程被赋予任务并恢复。
因此,通过为每个线程提供任务的方法指针,您实际上定义了每个线程每次处理的作业类型 运行.

使用线程池的主要优点是这样做避免了为每个特定任务创建和销毁线程的开销。

至于OmniThreadLibrary,它是一个成熟的任务管理库。它使用自己的线程池和一个非常先进的任务管理系统,允许您轻松定义哪些任务可以并行执行,哪些任务需要顺序执行,哪些任务比其他任务具有更高的优先级。

OmniThreadLibrary 的唯一缺点是它仍然仅限于 Windows,因此如果您正在考虑为您的应用程序提供多平台支持,那么您将不得不寻找其他解决方案。