Thread就是Thread,需要自己調度,適合長跑型的操作。
ThreadPool是Thread基礎上的一個線程池,目的是減少頻繁創建線程的開銷。線程很貴,要開新的stack,要增加CPU上下文切換,所以ThreadPool適合頻繁、短期執行的小操作。調度算法是自適應的,會根據程序執行的模式調整配置,通常不需要自己調度線程。另外分為Worker和IO兩個池。IO線程對應Native的overlapped io,Win下利用IO完成端口實現非阻塞IO。
Task或者說TPL是一個更上層的封裝,NB之處在於continuation。continuation的意義在於:高性能的程序通常都是跑在IO邊界或者UI事件的邊界上的,TPL的continuation可以更方便的寫這種高scalability的代碼。Task會根據一些flag,比如是不是long-running來決定底層用Thread還是ThreadPool,另外也做了些細節優化,比如同一個線程跑好幾個Task,比如continuation時根據情況讓CPU空轉幾毫秒來等待前置Task結束,都是為了減少CPU上下文切換。
結論:能用Task就用Task,底下都是用的Thread或者ThreadPool。但是要注意細節,比如告訴Task是不是long-running;比如盡量別Wait;再比如IO之后的continuation要盡快結束然后把線程還回去,有事開個Worker做,要不然會影響后面的IO,等等。
另外還有個特別的是Timer,所有Timer實例都是在一個專門的Timer線程上調度的。所以不要寫的很重,要不然原本已經很低的精度會更加慘不忍睹。