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

  1. using System;
  2.  
  3. using System.Collections.Generic;
  4.  
  5. using System.Linq;
  6.  
  7. using System.Text;
  8.  
  9. using System.Threading;
  10.  
  11. namespace ConsoleApplication1
  12.  
  13. {
  14.  
  15. class Program
  16.  
  17. {
  18.  
  19. static void Main(string[] args)
  20.  
  21. {
  22.  
  23. AutoResetEvent autoEvent = new AutoResetEvent(false);
  24.  
  25. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), autoEvent);
  26.  
  27. ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod), autoEvent);
  28.  
  29. Console.ReadLine();
  30.  
  31. }
  32.  
  33. static void ThreadMethod(object stateInfo)
  34.  
  35. {
  36.  
  37. for (int i = 0; i < 100;i++ )
  38.  
  39. Console.WriteLine("ThreadOne, executing ThreadMethod, " + "is {0}from the thread pool.", Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");
  40.  
  41. }
  42.  
  43. static void WorkMethod(object stateInfo)
  44.  
  45. {
  46.  
  47. for (int i = 0; i < 100; i++)
  48.  
  49. Console.WriteLine("ThreadTwo, executing WorkMethod");
  50.  
  51. }
  52.  
  53. }
  54.  
  55. }

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

图1  运行结果的上半部

图2  运行结果的下半部

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

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

  1. using System;
  2.  
  3. using System.Collections.Generic;
  4.  
  5. using System.Linq;
  6.  
  7. using System.Text;
  8.  
  9. using System.Threading;
  10.  
  11. namespace ConsoleApplication1
  12.  
  13. {
  14.  
  15. class Program
  16.  
  17. {
  18.  
  19. static void Main(string[] args)
  20.  
  21. {
  22.  
  23. AutoResetEvent autoEvent = new AutoResetEvent(false);
  24.  
  25. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadMethod), autoEvent);
  26.  
  27. autoEvent.WaitOne();
  28.  
  29. ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod), autoEvent);
  30.  
  31. autoEvent.WaitOne();
  32.  
  33. Console.ReadLine();
  34.  
  35. }
  36.  
  37. static void ThreadMethod(object stateInfo)
  38. {
  39.  
  40. for (int i = 0; i < 100;i++ )
  41.  
  42. Console.WriteLine("ThreadOne, executing ThreadMethod, " + "is {0}from the thread pool.", Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");
  43.  
  44. ((AutoResetEvent)stateInfo).Set();
  45.  
  46. }
  47.  
  48. static void WorkMethod(object stateInfo)
  49.  
  50. {
  51.  
  52. for (int i = 0; i < 100; i++)
  53.  
  54. Console.WriteLine("ThreadTwo, executing WorkMethod");
  55.  
  56. ((AutoResetEvent)stateInfo).Set();
  57.  
  58. }
  59.  
  60. }
  61.  
  62. }

运行结果如下:

C#中控制线程池的执行顺序的更多相关文章

  1. 探究ElasticSearch中的线程池实现

    探究ElasticSearch中的线程池实现 ElasticSearch里面各种操作都是基于线程池+回调实现的,所以这篇文章记录一下java.util.concurrent涉及线程池实现和Elasti ...

  2. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

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

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

  4. Android中的线程池

    在Android中,主线程不能执行耗时的操作,否则可能会导致ANR.那么,耗时操作应该在其它线程中执行.线程的创建和销毁都会有性能开销,创建过多的线程也会由于互相抢占系统资源而导致阻塞的现象.这个时候 ...

  5. mina2中的线程池

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

  6. java并发编程(四) 线程池 & 任务执行、终止源码分析

    参考文档 线程池任务执行全过程:https://blog.csdn.net/wojiaolinaaa/article/details/51345789 线程池中断:https://www.cnblog ...

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

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

  8. 戏(细)说Executor框架线程池任务执行全过程(上)

    一.前言 1.5后引入的Executor框架的最大优点是把任务的提交和执行解耦.要执行任务的人只需把Task描述清楚,然后提交即可.这个Task是怎么被执行的,被谁执行的,什么时候执行的,提交的人就不 ...

  9. Spring中的线程池和定时任务功能

    1.功能介绍 Spring框架提供了线程池和定时任务执行的抽象接口:TaskExecutor和TaskScheduler来支持异步执行任务和定时执行任务功能.同时使用框架自己定义的抽象接口来屏蔽掉底层 ...

随机推荐

  1. C++中rand()函数的用法

    1.rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数. 2.如果你要产生0~99这100个整数中的一个随机整数,可以表达为:int num = r ...

  2. UI及物体渲染顺序

    1.决定UI渲染在所有物体前,ZTest Always,Canvas中的RenderMode影响该值. 2.都是ZTest Always 时影响覆盖的因素: 父子及先后关系: 渲染队列: sortin ...

  3. JvisualVm添加远程监控

    一.Weblogic远程监控 1.首先需要在远程的weblogic的域下面,找到/bin/ setDomainEnv.sh ,需要在此文件下加入如下内容: -Dcom.sun.management.j ...

  4. 如何批量清除128组节点db上面的过期的binlog,释放磁盘空间。(转)

    如果10台以内的db的话,自己手动ssh进去,clean就足以,但是上百台呢,就要写脚本了.大概思路:在 一台db跳转机上面, 写一个脚本,访问slave,远程获取正在复制的master上面的binl ...

  5. DB字段顺序与类的属性顺序一致:{Oracle.DataAccess.Client.OracleException ORA-00932: 数据类型不一致: 应为 TIMESTAMP, 但却获得 NUMBER

    {Oracle.DataAccess.Client.OracleException ORA-00932: 数据类型不一致: 应为 TIMESTAMP, 但却获得 NUMBER     应用程序中类型T ...

  6. POJ3264(RMQ-ST算法)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 47087   Accepted: 22101 ...

  7. Windows SID理解

    Windows安全性要依赖于几个基本元素.:访问令牌.SID.安全描述符.访问控制列表.密码. 访问令牌:访问令牌在本质上定义了两 上“P”:Permissions(权限)和Privilege(特权) ...

  8. 机器学习:SVM(基础理解)

    一.基础理解 1)简介 SVM(Support Vector Machine):支撑向量机,既可以解决分类问题,又可以解决回归问题: SVM 算法可分为:Hard Margin SVM.Soft Ma ...

  9. Python:函数变量的使用

    1.上层函数不能直接使用其嵌套函数的变量: def func1(x, y): z = x + y def func2(): m = 3 z += m return z print(func1(1, 2 ...

  10. Python:列表中,增加元素、删除元素、切片、其它

    一.向列表中增加元素 list.append(单个元素):在list列表末端增加一个元素: list.extend([元素1,元素2]):在list列表末端增加多个元素: list.insert(元素 ...