【文件属性】:
文件名称:不足以解-详解java 三种调用机制(同步、回调、异步)
文件大小:4.56MB
文件格式:PDF
更新时间:2021-06-30 03:17:10
Delphi
如果你取消注释,一切都会像预期的那样工作。(顺便说一下,Sleep(0)不足以解
决问题。)
另一个解决方案是创建一个新的线程池,并限制该池中运行的线程的最小数
量。(我知道我还没有提到线程池,但是我马上就会解决这个问题。)然后,我们
可以告诉任务在线程池中运行。
这个演示程序有一个名为 btnCustomThreadPoolClick的方法,它就是这样做
的。它几乎完全等同于 btnCheckPrimes2Click,差别在于以下四点。
首先,它声明了一个内部线程池变量 tp: TThreadPool。其次,它创建这个线
程池并限制它的运行线程的最小数量。这将防止线程池启动太少的工作线程。第
三,将 tp变量作为附加参数传递给 TTask.Run。它告诉 TTask在线程池中启动任
务,而不是使用默认的单线程方式。最后,在所有任务完成之后,tp threadpool
将被销毁。
下面的代码片段只显示了该方法的中心部分,足以看到如何使用线程池:
tp := TThreadPool.Create;
if not tp.SetMinWorkerThreads(numTasks) then
ListBox1.Items.Add('Failed to set minimum number of worker threads');
lowBound := 0;
for i := 1 to numTasks do
begin
highBound := Round(CHighestNumber / numTasks * i);
tasks[i-1] := TTask.Run(PrepareTask2(lowBound, highBound, @aggregate),
tp);
lowBound := highBound + 1;
end;
TTask.WaitForAll(tasks);
FreeAndNil(tp);
Thread pooling
虽然启动一个线程比创建一个新进程快得多,但它仍然是一个相对缓慢的操
作。创建一个新线程可能只需几毫秒。因为在每毫秒计算一次的高性能应用程序
中,大多数基于任务和模式的库都使用线程池的概念。
线程池只是管理未使用线程的存储。例如,假设您的应用程序——到目前为