Thread Pool Sizing - ZjzMisaka/PowerThreadPool.zh-CN.Wiki GitHub Wiki

线程池的线程数会根据线程池的工作负载进行动态调整.

最大线程数

最大线程数可以通过PowerPoolOption.MaxThreads设置 (默认值是处理器核心数 * 2), 此时, 线程池维护的线程数将稳定在此计数, 除非设置了 DestroyThreadOption 属性.

// MaxThreads == the number of processor cores * 2
PowerPool powerPool = new PowerPool();
// MaxThreads == 8
PowerPool powerPool = new PowerPool(new PowerPoolOption()
{
    MaxThreads = 8
});

自动销毁空闲线程

设置DestroyThreadOption后, 线程池中的初始线程数将被设置为DestroyThreadOption.MinThreads. 当所有线程都正在运行并且添加了一个新任务时, 新的线程将被创建, 直到线程数量达到PowerPoolOption.MaxThreads.

当线程变为空闲状态时, 它将保持空闲状态并等待新的工作, 直到等待时间超过DestroyThreadOption.KeepAliveTime. 在此之后, 除非当前线程数等于DestroyThreadOption.MinThreads, 否则线程将被销毁释放.

PowerPool powerPool = new PowerPool(new PowerPoolOption()
{
    MaxThreads = 8,
    DestroyThreadOption = new DestroyThreadOption() { MinThreads = 4, KeepAliveTime = 3000 }
});

线程饥饿

如果有长时间运行的任务 (即WorkOption.LongRunning值为真), 线程池中的最大线程数将是MaxThreads加上长时间运行的任务数. 这种设计通过允许长时间运行的任务在其他线程上运行来专门解决线程饥饿问题, 确保短期任务可以对线程池进行访问, 并且任务的执行不会被过度延迟.

// Thread count == 8
PowerPool powerPool = new PowerPool(new PowerPoolOption()
{
    MaxThreads = 8
});

// Thread count == 9
powerPool.QueueWorkItem(() => 
{
    // Do something
}, new WorkOption()
{
    LongRunning = true,
});