文件名称:不足以解-详解java 三种调用机制(同步、回调、异步)
文件大小:4.56MB
文件格式:PDF
更新时间:2024-07-19 21:03:50
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 虽然启动一个线程比创建一个新进程快得多,但它仍然是一个相对缓慢的操 作。创建一个新线程可能只需几毫秒。因为在每毫秒计算一次的高性能应用程序 中,大多数基于任务和模式的库都使用线程池的概念。 线程池只是管理未使用线程的存储。例如,假设您的应用程序——到目前为