zoukankan      html  css  js  c++  java
  • C# -- 使用线程池 ThreadPool 执行多线程任务

    1. 使用线程池

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             WaitCallback wc1 = s =>{
     6                 Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
     7                 Stopwatch stw = new Stopwatch();
     8                 stw.Start();
     9                 long result = SumNumbers(10000000);
    10                 stw.Stop();
    11                 Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},",Thread.CurrentThread.ManagedThreadId,result,stw.ElapsedMilliseconds);
    12             };
    13             WaitCallback wc2 = s => {
    14                 Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
    15                 Stopwatch stw = new Stopwatch();
    16                 stw.Start();
    17                 long result = SumNumbers(10000000);
    18                 stw.Stop();
    19                 Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
    20             };
    21             WaitCallback wc3 = s => {
    22                 Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
    23                 Stopwatch stw = new Stopwatch();
    24                 stw.Start();
    25                 long result = SumNumbers(10000000);
    26                 stw.Stop();
    27                 Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
    28             };
    29 
    30             
    31             ThreadPool.QueueUserWorkItem(wc1);
    32             ThreadPool.QueueUserWorkItem(wc2);
    33             ThreadPool.QueueUserWorkItem(wc3);
    34 
    35             Console.ReadKey();
    36         }
    37 
    38         static long SumNumbers(int count)
    39         {
    40             long sum = 0;
    41             for (int i = 0; i < count; i++)
    42             {
    43                 sum += i;
    44             }
    45             Thread.Sleep(1000);
    46             return sum;
    47         }
    48     }

    执行结果:

    2. 等待线程池的线程执行

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             using (ManualResetEvent m1 = new ManualResetEvent(false))
     6             using (ManualResetEvent m2 = new ManualResetEvent(false))
     7             using (ManualResetEvent m3 = new ManualResetEvent(false))
     8             {
     9                 ThreadPool.QueueUserWorkItem(
    10                     s =>{
    11                         Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
    12                         Stopwatch stw = new Stopwatch();
    13                         stw.Start();
    14                         long result = SumNumbers(10000000);
    15                         stw.Stop();
    16                         m1.Set();
    17                         Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
    18                     });
    19 
    20                 ThreadPool.QueueUserWorkItem(
    21                     s =>{
    22                         Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
    23                         Stopwatch stw = new Stopwatch();
    24                         stw.Start();
    25                         long result = SumNumbers(10000000);
    26                         stw.Stop();
    27                         m2.Set();
    28                         Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
    29                     });
    30                 ThreadPool.QueueUserWorkItem(
    31                     s =>{
    32                         Console.WriteLine("线程ID:{0},开始执行", Thread.CurrentThread.ManagedThreadId);
    33                         Stopwatch stw = new Stopwatch();
    34                         stw.Start();
    35                         long result = SumNumbers(10000000);
    36                         stw.Stop();
    37                         m3.Set();
    38                         Console.WriteLine("线程ID:{0},执行完成,执行结果:{1},执行用时{2},", Thread.CurrentThread.ManagedThreadId, result, stw.ElapsedMilliseconds);
    39                     });
    40 
    41                 //等待线程池的线程执行
    42                 m1.WaitOne();
    43                 m2.WaitOne();
    44                 m3.WaitOne();
    45                 Console.WriteLine("所有线程执行完成");
    46 
    47             }
    48 
    49             Console.ReadKey();
    50         }
    51 
    52         static long SumNumbers(int count)
    53         {
    54             long sum = 0;
    55             for (int i = 0; i < count; i++)
    56             {
    57                 sum += i;
    58             }
    59             Thread.Sleep(3000);
    60             return sum;
    61         }
    62     }

    执行结果:

  • 相关阅读:
    delphi vcl图像的二值化
    黑科技工具,推荐两款开源自动生成代码神器!
    推荐一款最强Python自动化神器!不用写一行代码!
    Java 展开或折叠PDF中的书签
    C# / VB.NET 获取PDF文档的数字签名信息
    滚蛋了
    MySQL 执行计划
    MySQL优化索引
    延时队列 DelayQueue
    【MongoDB】MongoDB 的存储过程
  • 原文地址:https://www.cnblogs.com/kliine/p/10168315.html
Copyright © 2011-2022 走看看