使用Task的连续任务模拟实现类似java的ExecutorService线程池
class MyThreadPool {
private List<Task> ThreadList = new List<Task>();//线程队列
private int RunningThreadNum;//正在执行的任务数
private int MaxThreadNum;//最大线程数
private int index;//取值下标
public MyThreadPool(int MaxThreadNum) {//创建固定数目线程池
this.MaxThreadNum = MaxThreadNum;
RunningThreadNum = 1;
index = 0;
}
//添加线程
public void AddTask(Task newTask) {
ThreadList.Add(newTask);
}
//执行线程并等待完成
public void RunAndWait() {
while(index < ThreadList.Count) {
if (RunningThreadNum <= MaxThreadNum) {
Task t = ThreadList[index];//取出任务
t.ContinueWith((s) => {
RunningThreadNum--;//执行完就--
});
t.Start();//执行
RunningThreadNum++;//计数+1
index++;
} else {
//任务队列塞满了
continue;
}
}
//等待全部执行完成
foreach (Task t in ThreadList) {
t.Wait();
}
}
}
调用也很简单
public static void Main(String[] args) {
//创建线程池,每秒最大同时运行5条线程
MyThreadPool pool = new MyThreadPool(5);
for(int i = 0; i < 10; i++) {
MyClass cl = new MyClass(i);//自己定义的类
Task t = new Task(() => {
cl.Strat();//创建线程执行类中的方法
});
pool.AddTask(t);//将线程放入线程池
}
pool.RunAndWait();//开始运行子线程并等待线程运行结束
Console.WriteLine("主线程运行结束");//只有线程池所有任务执行完才会执行这行代码
}