C#多线程之线程池ThreadPool用法

C#多线程之线程池ThreadPool用法

线程池ThreadPool是什么

在程序运行过程中,有时会出现需要进行并发处理的情况。与传统的线程操作(Thread类)相比,线程池可以更好地管理线程资源,提高线程的复用率,避免了频繁创建和销毁线程的开销,从而提高了程序的性能和稳定性。

线程池通过预先创建一组线程并维护这些线程,让它们在没有工作时处于等待状态,一旦有工作需要处理,就将工作丢进线程池中,由池中的线程去执行。线程池还可以统计线程活动情况、限制可并发的线程数、管理线程的状态等等。.NET Framework提供了ThreadPool类来实现线程池功能。

线程池ThreadPool基本用法

创建线程池

指定最大线程数和完成队列大小,在开始使用线程池之前必须先创建一个。

ThreadPool.SetMaxThreads(int workerThreads, int completionPortThreads);

提交任务

方式1:将工作对象WaitCallback类型作为参数传递。

ThreadPool.QueueUserWorkItem(new WaitCallback(Process), data);

方式2:Lambda表达式传递。

ThreadPool.QueueUserWorkItem(state =>
{
    // do something    
}, null);

注意:如果需要将一个变量传递给任务,最好通过Lambda表达式把变量赋值给state参数,避免在多线程的情况下出现竞争条件。

线程池常用方法

  1. 获取当前线程池中可用的工作线程数和已完成的异步 I/O 操作线程数:
ThreadPool.GetAvailableThreads(out int workerThreads, out int completionPortThreads);
Console.WriteLine($"线程池中可用的工作线程数:{workerThreads}\n线程池中已完成的异步 I/O 操作线程数:{completionPortThreads}\n");
  1. 获取已请求的线程数和已完成的异步 I/O 操作数:
ThreadPool.GetMaxThreads(out int workerThreads, out int completionPortThreads);
Console.WriteLine($"线程池中请求的工作线程数:{workerThreads}\n线程池中已完成的异步 I/O 操作线程数:{completionPortThreads}\n");
  1. 获取等待执行的工作项数量:
int availableWorkerThreads, availableCompletionPortThreads;
ThreadPool.GetAvailableThreads(out availableWorkerThreads, out availableCompletionPortThreads);
Console.WriteLine($"线程池中等待处理的工作项数:{availableWorkerThreads}\n");

线程池ThreadPool使用示例

示例1:线程池调用简单方法

创建一个线程池,使用QueueUserWorkItem方法异步调用方法WorkProcess:

static void WorkProcess(object state)
{
    Console.WriteLine($"线程池处理方法:{state}");
}

static void Main(string[] args)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(WorkProcess),"Welcome to ThreadPool");
    Console.ReadLine();
}

输出结果为:

线程池处理方法:Welcome to ThreadPool

示例2:线程池处理复杂计算操作

使用QueueUserWorkItem异步调用方法Calculate,模拟一个大量耗时的计算操作,通过ManualResetEvent控制等待线程池中的线程都处理完成之后再输出结果。

static void Calculate(object state)
{
    Thread.Sleep(5000); // 模拟一个耗时计算操作
    int n = (int)state;
    Console.WriteLine($"线程池处理结果:{n * n}");
    mre.Set(); // 所有线程都处理完成退出等待状态
}

static ManualResetEvent mre = new ManualResetEvent(false);

static void Main(string[] args)
{
    int count = 10;
    for (int i = 0; i < count; i++)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(Calculate), i);
    }
    mre.WaitOne(); // 等待所有线程都处理完再输出结果
    Console.WriteLine("所有线程池中的线程都已处理完毕!");
    Console.ReadLine();
}

输出结果为:

线程池处理结果:0
线程池处理结果:1
线程池处理结果:4
线程池处理结果:9
线程池处理结果:16
线程池处理结果:25
线程池处理结果:36
线程池处理结果:49
线程池处理结果:64
线程池处理结果:81
所有线程池中的线程都已处理完毕!
阅读剩余 61%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程之线程池ThreadPool用法 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • go并发编程sync.Cond使用场景及实现原理

    关于“go并发编程sync.Cond使用场景及实现原理”的完整攻略,我将分成以下几个部分进行说明: sync.Cond简介 sync.Cond使用场景 sync.Cond实现原理 示例说明 1. sync.Cond简介 sync.Cond是go语言标准库中的一个并发编程工具,用于在多个goroutine之间传递信号和通知。它是基于互斥锁(mutex)和条件变…

    多线程 2023年5月16日
    00
  • Java 多线程实例详解(三)

    让我来为你详细讲解“Java 多线程实例详解(三)”的完整攻略。 什么是Java多线程 在学习Java多线程之前,我们先来了解一下什么是多线程。线程是操作系统中进程内的一个独立执行单元,也是程序开发中实现多任务并发的一种手段。多线程可以提高程序的处理能力和运行效率。 在Java中,多线程可以通过线程类Thread来实现。一个Java应用程序从main()方法…

    多线程 2023年5月17日
    00
  • Kotlin使用协程实现高效并发程序流程详解

    Kotlin使用协程实现高效并发程序流程详解 什么是协程? 协程是一种轻量级的并发机制,可以让我们像编写同步代码一样编写异步代码。在 Kotlin 中,协程由 kotlinx.coroutines 库提供,可以通过将 suspend 函数与 coroutine builder(例如 launch、async等)结合使用来实现。 协程的实现原理 协程的实现依赖…

    多线程 2023年5月17日
    00
  • java并发之synchronized

    Java 并发之 synchronized 在 Java 中,我们可以使用 synchronized 来保证多线程程序的线程安全。本文将介绍 synchronized 的使用方式和注意事项。 synchronized 使用方式 synchronized 有三种使用方式: 1. 修饰实例方法 public synchronized void method() …

    多线程 2023年5月16日
    00
  • Java多线程的原子性,可见性,有序性你都了解吗

    当多个线程并发执行同一段代码时,有可能会出现线程安全问题。而Java多线程的原子性,可见性和有序性是解决这些线程安全问题的关键。 原子性:原子性指的是一个操作不可中断,要么全部执行成功,要么全部执行失败。Java的基本数据类型的读取和赋值都是具有原子性的。但当多个线程同时对同一个变量进行运算时,就需要考虑原子性的问题。 示例说明: public class …

    多线程 2023年5月16日
    00
  • java 多线程的三种构建方法

    Java 多线程的三种构建方法 在 Java 中,有三种常用的多线程构建方法:继承 Thread 类、实现 Runnable 接口和实现 Callable 接口。个人建议在实际开发中尽量使用实现 Runnable 接口的方法。 继承 Thread 类 继承 Thread 类是 Java 最原始的多线程实现方法。具体实现过程是创建一个类继承 Thread 类,…

    多线程 2023年5月17日
    00
  • Java线程创建的四种方式总结

    让我来为你详细讲解“Java线程创建的四种方式总结”的完整攻略。 简介 Java线程是多任务处理的一部分,允许程序并发执行。Java提供多种线程创建的方式,本文将总结四种常见的线程创建方式,并提供相应示例。 原始方法 原始的线程创建方法是通过实现Runnable接口来创建一个线程。需要创建一个类并实现Runnable接口的run()方法。在创建线程时,创建一…

    多线程 2023年5月16日
    00
  • Java线程同步方法实例总结

    Java线程同步方法实例总结 什么是线程同步? 在Java多线程中,多个线程同时访问同一份数据时,就有可能出现数据的不一致性。而线程同步就是一种提供独占访问共享资源的机制,确保同时只有一个线程访问共享资源,从而避免并发访问导致的数据不一致性问题。 如何实现线程同步? Java语言提供了两种实现线程同步的机制:synchronized同步块和Lock锁。 sy…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部