线程释放解决方案
线程释放
做了小实验,想看一下用threadpool会不会自动释放线程。实验发现只有当程序结束时才会释放。为什么每一次开启的线程没有结束?该如何控制让他每一次执行完就结束。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//using ThreadPool1;
namespace ThreadPool1
{
class Class1
{
public static void Main()
{
for (int i = 0; i < 9800; i++)
{
System.Threading.ThreadPool.QueueUserWorkItem(delegate
{
System.Threading.Thread.Sleep(60000);
Console.WriteLine("nestedThread1");
});
}
Console.ReadLine();
}
}
}
------解决思路----------------------
你可以把线程池想象成银行的服务窗口
一共就只开6个窗口,就可以轮流为1000人服务
而不是来了一个人,就必须对应的有一个工作人员去开一个窗口,顾客走了马上又把窗口关了
------解决思路----------------------
线程池可以设置最小线程数量和最大线程数量
好比银行里最多就只有10个窗口,可能人少的时候不会全部开放,人多了动态开一些窗口
这样最少会开1个窗口(否则就直接关门算了),最多可以开10个窗口
线程池也一样,设置了最小线程数量之后,哪怕队列里没有任何任务,线程也不会释放,会一直等待着,这样有任务就可以立即处理,而不用先开线程;达到最大线程数量之后,就不会继续开更多的线程,以免造成CPU负担过重反而降低效率
线程池里动态开线程是有一个过程的,不会像你手动启动线程一样那么快.有人测试过大约是每秒可以开2个线程.
------解决思路----------------------
通常我们使用系统线程池分配线程,绝不应该在线程所执行的程序中进行“循环、阻塞”的事情。特别是对于 I/O 线程 更是如此。如果你经过测试,统计出占用线程大多(比如说80%以上)都是0.1~1000毫秒之间,少量(比如说15%)需要几秒来完成,只有极个别的需要1分钟完成,不存在“循环、不结束”的线程,这样的设计是比较好的。
如果你发现有9800个任务要消耗1分钟,你应该重新考虑你的程序了,考虑你是否应该让程序跑得更加灵敏一些。
------解决思路----------------------
当你堆积9800个要阻塞1分钟的任务时,线程池调度线程来完成这所有任务也许需要几十分钟。
你的程序肯定可以结束,线程也肯定可以释放(重用),但是关键是你不应该这样设计程序。
做了小实验,想看一下用threadpool会不会自动释放线程。实验发现只有当程序结束时才会释放。为什么每一次开启的线程没有结束?该如何控制让他每一次执行完就结束。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//using ThreadPool1;
namespace ThreadPool1
{
class Class1
{
public static void Main()
{
for (int i = 0; i < 9800; i++)
{
System.Threading.ThreadPool.QueueUserWorkItem(delegate
{
System.Threading.Thread.Sleep(60000);
Console.WriteLine("nestedThread1");
});
}
Console.ReadLine();
}
}
}
------解决思路----------------------
你可以把线程池想象成银行的服务窗口
一共就只开6个窗口,就可以轮流为1000人服务
而不是来了一个人,就必须对应的有一个工作人员去开一个窗口,顾客走了马上又把窗口关了
------解决思路----------------------
线程池可以设置最小线程数量和最大线程数量
好比银行里最多就只有10个窗口,可能人少的时候不会全部开放,人多了动态开一些窗口
这样最少会开1个窗口(否则就直接关门算了),最多可以开10个窗口
线程池也一样,设置了最小线程数量之后,哪怕队列里没有任何任务,线程也不会释放,会一直等待着,这样有任务就可以立即处理,而不用先开线程;达到最大线程数量之后,就不会继续开更多的线程,以免造成CPU负担过重反而降低效率
线程池里动态开线程是有一个过程的,不会像你手动启动线程一样那么快.有人测试过大约是每秒可以开2个线程.
------解决思路----------------------
通常我们使用系统线程池分配线程,绝不应该在线程所执行的程序中进行“循环、阻塞”的事情。特别是对于 I/O 线程 更是如此。如果你经过测试,统计出占用线程大多(比如说80%以上)都是0.1~1000毫秒之间,少量(比如说15%)需要几秒来完成,只有极个别的需要1分钟完成,不存在“循环、不结束”的线程,这样的设计是比较好的。
如果你发现有9800个任务要消耗1分钟,你应该重新考虑你的程序了,考虑你是否应该让程序跑得更加灵敏一些。
------解决思路----------------------
当你堆积9800个要阻塞1分钟的任务时,线程池调度线程来完成这所有任务也许需要几十分钟。
你的程序肯定可以结束,线程也肯定可以释放(重用),但是关键是你不应该这样设计程序。