在使用线程池时,当用线程池执行多个任务时,由于执行的任务时间过长,会导制两个任务互相执行,如果两个任务具有一定的操作顺序,可能会导制不同的操作结果,这时,就要将线程池按顺序操作。下面先给一段代码,该代码是不按顺序对线程池进行操作的,代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ConsoleApplication1{class Program{static void Main(string[] args){AutoResetEvent autoEvent = new AutoResetEvent(false);ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), autoEvent);ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod), autoEvent);Console.ReadLine();}static void ThreadMethod(object stateInfo){for (int i = 0; i < 100;i++ )Console.WriteLine("ThreadOne, executing ThreadMethod, " + "is {0}from the thread pool.", Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");}static void WorkMethod(object stateInfo){for (int i = 0; i < 100; i++)Console.WriteLine("ThreadTwo, executing WorkMethod");}}}

运行结果如图1、图2所示。

图1  运行结果的上半部

图2  运行结果的下半部

从图1、图2可以看出,在使用线程池对线程进行操作时,由于各任务的时间过长,多个任务的线程可能会交互操作,那么,如何才能将线程池按指定的顺序进行操作呢?主要是用AutoResetEvent类来实现的。

可以用AutoResetEvent类的WaitOne方法阻止线程,然后只执行当前操作的线程池,当遇到AutoResetEvent类的Set方法后,将当前线程设置为终止状态,执行其他等待的线程。修改后的代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ConsoleApplication1{class Program{static void Main(string[] args){AutoResetEvent autoEvent = new AutoResetEvent(false);ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), autoEvent);autoEvent.WaitOne();ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod), autoEvent);autoEvent.WaitOne();Console.ReadLine();} static void ThreadMethod(object stateInfo){for (int i = 0; i < 100;i++ )Console.WriteLine("ThreadOne, executing ThreadMethod, " + "is {0}from the thread pool.", Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");((AutoResetEvent)stateInfo).Set();}static void WorkMethod(object stateInfo){for (int i = 0; i < 100; i++)Console.WriteLine("ThreadTwo, executing WorkMethod");((AutoResetEvent)stateInfo).Set();}}}

运行结果如下:

转载于:https://www.cnblogs.com/DonetRen/p/10177339.html

C#中控制线程池的执行顺序相关推荐

  1. disruptor中的线程池作用

    Disruptor 的线程池用于执行某些工作.通常情况下,线程池会创建一些线程来执行工作队列中的任务.当某个任务需要执行时,它会被提交到工作队列,然后由线程池中的某个线程执行.这样做的优点是可以减少线 ...

  2. python 判断线程是否执行完毕_判断线程池中的线程是否全部执行完毕

    在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...

  3. 判断线程池中的线程是否全部执行完毕

    在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...

  4. java mina多线程_mina2中的线程池

    一.Mina中的线程池模型 前面介绍了Mina总体的层次结构,那么在Mina里面是怎么使用Java NIO和进行线程调度的呢?这是提高IO处理性能的关键所在.Mina的线程调度原理主要如下图所示: A ...

  5. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  6. java中的线程池有哪些,分别有什么作用?

    阅读完本篇文章会知道如下三点: 1.进程-线程简单介绍 2.java的线程池是什么,有哪些类型,作用分别是什么 3.使用线程池的优点 1.进程-线程的简单介绍 进程 什么是进程呢? 进程是计算机中的程 ...

  7. JAVA中创建线程池的五种方法及比较

    之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...

  8. C# 多线程 线程池(ThreadPool) 2 如何控制线程池?

    线程池启动了,但是没有方法去控制线程池,如果子线程出现了问题,难道线程池就死了吗? 我们可以设置线程池的线程数量,进行加入任务,线程池会自动分配并且合理的执行,但是控制不了又有啥意思呢. 线程池里线程 ...

  9. python停止线程池_详解python中Threadpool线程池任务终止示例代码

    需求 加入我们需要处理一串个位数(0~9),奇数时需要循环打印它:偶数则等待对应时长并完成所有任务:0则是错误,但不需要终止任务,可以自定义一些处理. 关键点 定义func函数处理需求 callbac ...

最新文章

  1. flux读取不到数据_spring-webflux两种开发模式,获取不到使用ajax的post提交的数据?...
  2. python入门指南百度云-Python入门指南
  3. 【PHP】多线程请求 curl_multi_init()
  4. php win2003 下载,64位windows2003iis安装包|《win2003 iis安装包》64位完整版附安装PHP教材...
  5. C语言实现Trie字典树 (附完整源码)
  6. 一起撸个朋友圈吧(step5) - 控件篇【评论控件优化】
  7. java的未检查异常有哪些_Java:检查异常与未检查异常
  8. Android Framework中的Application Framework层介绍
  9. 电脑怎么换自己的壁纸_怎么才能给自己的爱机一个合理的价格—想把自己电脑回收的...
  10. Ubuntu 的 bash和dash的区别
  11. iOS音乐后台播放及锁屏信息显示
  12. php对产品添加属性,php – Woocommerce:使用现有属性为现有产品添加变体
  13. 手机不ROOT使用xposed框架-微信群同步-微咖讲师-安装教程
  14. 【sklearn第五讲】特征提取(上)
  15. pic16f616单片机C语言编程,PIC16F616型单片机介绍
  16. 如何解决速达软件出现主键、单号、编码相同的报错
  17. 【Matlab 六自由度机器人】运动学逆解(附MATLAB机器人逆解代码)
  18. 武汉都有哪些互联网公司?
  19. Premiere pro在图片中插入视频元素
  20. bim oracle,IBMS和BIM的融合之路

热门文章

  1. python怎么引用多行输入_python调用shell返回两行第二行需要输入密码怎么办?import os os.syst...
  2. linux thrift 安装目录,Linux下安装Thrift
  3. vue项目职责_进大厂兼职的机会来了!腾讯微校项目招人了!
  4. 《少年先疯队》第九次团队作业:Beta冲刺与团队项目验收
  5. 封装一个ViewPager真正的实现图片无限循环滚动带导航点
  6. (五)DOM4j进行XML文件的解析及生成
  7. 如何创建sequence
  8. 17---Net基础加强
  9. ogre plugin for 3dmax 最新进度和功能说明
  10. 黑白两客进入页面(1)