C# 多线程 线程池(ThreadPool) 2 如何控制线程池?
2017-11-16 09:35
344 查看
线程池启动了,但是没有方法去控制线程池,如果子线程出现了问题,难道线程池就死了吗?
我们可以设置线程池的线程数量,进行加入任务,线程池会自动分配并且合理的执行,但是控制不了又有啥意思呢。
线程池里线程的执行不影响主线程的运行的。
线程池中有一个东西叫做 信号灯 下面是一个例子:
public class Program
{
const int cycleNum = 10;
static AutoResetEvent myEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(2, 2);
for (int i = 1; i <= cycleNum; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(testFun),
i.ToString());
}
Console.WriteLine("主线程执行!");
Console.WriteLine("主线程结束!");
Console.WriteLine("阻塞");
myEvent.WaitOne();
Console.WriteLine("线程池终止!");
Console.ReadKey();
}
public static void testFun(object obj)
{
Console.WriteLine(string.Format("{0}:第{1}个线程",
DateTime.Now.ToString(), obj.ToString()));
Thread.Sleep(5000);
if (obj.ToString() == cycleNum.ToString())
{
Console.WriteLine("终止了");
myEvent.Set();
}
}
}
复制代码
代码的信号灯的作用,当任务全部投放在线程池中,我们开启了阻塞线程池。
之后,我们又在执行的函数中,添加了代码,也就是
if (obj.ToString() == cycleNum.ToString())
{
Console.WriteLine("终止了");
myEvent.Set();
}
很明显,我们判断了当前执行的数量以及我们项目的总数量。如果达到总数量,则代表线程池已经执行完毕,我们可以监控他是否完毕,
当代码:myEvent.WaitOne();
执行了,它不仅阻塞,他会等待。等到我们的myEvent.Set(); 信号发出之后,即可恢复继续执行。
我们可以设置线程池的线程数量,进行加入任务,线程池会自动分配并且合理的执行,但是控制不了又有啥意思呢。
线程池里线程的执行不影响主线程的运行的。
线程池中有一个东西叫做 信号灯 下面是一个例子:
public class Program
{
const int cycleNum = 10;
static AutoResetEvent myEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(2, 2);
for (int i = 1; i <= cycleNum; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(testFun),
i.ToString());
}
Console.WriteLine("主线程执行!");
Console.WriteLine("主线程结束!");
Console.WriteLine("阻塞");
myEvent.WaitOne();
Console.WriteLine("线程池终止!");
Console.ReadKey();
}
public static void testFun(object obj)
{
Console.WriteLine(string.Format("{0}:第{1}个线程",
DateTime.Now.ToString(), obj.ToString()));
Thread.Sleep(5000);
if (obj.ToString() == cycleNum.ToString())
{
Console.WriteLine("终止了");
myEvent.Set();
}
}
}
复制代码
代码的信号灯的作用,当任务全部投放在线程池中,我们开启了阻塞线程池。
之后,我们又在执行的函数中,添加了代码,也就是
if (obj.ToString() == cycleNum.ToString())
{
Console.WriteLine("终止了");
myEvent.Set();
}
很明显,我们判断了当前执行的数量以及我们项目的总数量。如果达到总数量,则代表线程池已经执行完毕,我们可以监控他是否完毕,
当代码:myEvent.WaitOne();
执行了,它不仅阻塞,他会等待。等到我们的myEvent.Set(); 信号发出之后,即可恢复继续执行。
相关文章推荐
- C# 多线程学习(六)线程池(ThreadPool)——线程资源的复用和自动管理
- C# 多线程编程之线程池的使用 (ThreadPool)
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
- [叩响C#之门]写给初学者:多线程系列( 十一)——线程池(ThreadPool)
- C#多线程实现方法——线程池(Thread Pool)
- Python多线程简易版 - 线程池threadpool
- 多线程系列 线程池ThreadPool
- C# 多线程编程(3):线程池ThreadPool
- ThreadPool 线程池[c#]
- android 多线程 - 线程池 Executors.newFixedThreadPool 的使用例子
- C# 线程池ThreadPool的学习
- C# ThreadPool 自定义线程管理池 实现多线程池管理 有助与开发多线程系统的线程运行情况监控。
- Java 多线程编程设计模式之 Thread Pool(线程池)
- 通过线程池使用多线程并发:ThreadPoolTaskExecutor 的应用例子
- C#线程池ThreadPool
- 完全解析Android多线程中线程池ThreadPool的原理和使用
- spring ThreadPoolTaskExecutor的线程池类实现多线程
- C#多线程实现方法——线程池(Thread Pool)
- ThreadPool 线程池[c#]