线程(Thread)、线程池(ThreadPool)技术

  线程:是Windows任务调度的最小单位。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数,在一个应用程序中,常常需要使用多个线程来处理不同的事情,这样可以提高程序的运行效率,也不会使主界面出现无响应的情况。在这里主要介绍线程(Thread)、线程池(ThreadPool)两种不同创建线程的区别

  在通常的情况下,当我们需要开启一个新的线程时,我们直接通过Thread(继承自 System.Threading;)去创建一个新的线程,这样做有一个好处就是我们可以拿到这个新创建的线程,并且可以对这个线程去做一些相关的操作。但是通过创建一个新的线程会比较消耗资源,我们都知道,操作系统的资源是有限的,当用户访问的多了,需要开启的线程也跟着多了,当开启的线程超过系统的最大线程数时,系统就容易出现崩溃。下面我们来看一下创建100个线程所需要的时间

 for (int i = 0; i < 100; i++)//创建100个线程
            {
                new Thread(() =>
                    {
                        Console.WriteLine("创建线程的ID为:"+Thread.CurrentThread.ManagedThreadId);

                    }).Start();
            }

            sw.Stop();
            Console.WriteLine("创建100个线程执行的时间为:"+sw.ElapsedMilliseconds.ToString());

  运行后我们发现创建100个线程的时间为489ms,并且每个线程都不同。当创建的线程数超过系统的最大线程数的话,那么系统直接over了。有没有解决的办法呢,答案当然是有的,就是线程池(ThreadPool)技术。

  通过创建线程池对象,当需要使用线程时,就去池中看有没有创建好的线程,有的话就直接将创建好的线程拿出来,线程池中没有的话,就新创建一个线程,当线程使用完后,将放回线程池中供下次使用,这样不仅可以减少创建线程消耗的时间以及消耗的内存,还能够提高线程的利用率。

 for (int i = 0; i < 100; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback((s) => {
                    Console.WriteLine("创建线程的ID为:" + Thread.CurrentThread.ManagedThreadId);
                }));
            }

  从上面的运行结果我们可以发现,通过线程池去创建的线程,或者更准确点应该是去线程池获取线程比创建线程所花的时间简直是天差地别,线程的ID也是重复的,这也是通过线程池来获取线程可以提高线程的利用率。在这里需要注意的一点是通过线程池获取的线程都默认为后台线程

  最后,简单的介绍一下Task工作任务项,Task为.net4.0引入的新的使用线程池技术,微软的MSDN上这样介绍:Task 类的表示的单个操作不会返回一个值,通常以异步方式执行。 Task 对象是一种的中心思想 基于任务的异步编程模式 首次引入.NET Framework 4 中。

  在通过工厂开启的新的线程池工作任务项,会直接执行,而通过自己创建的新飞工作任务项,需要自己手动去开启执行

//使用工厂创建一个工作任务项,并执行了
Task t1 = Task.Factory.StartNew(() => {
                //执行代码
            });

//Task t1 = new Task(() =>
            //    {
            //        Thread.Sleep(2000);
            //        Console.WriteLine("当前的线程是:"+Thread.CurrentThread.ManagedThreadId);

            //    });
            //t1.Start();//需要手动启动去执行

  总结:在实际的开发中,当不需要对线程进行操作的话,不要手动去创建线程,尽量的使用线程池技术去创建开启一个线程,可以提高线程的使用效率,使用线程池技术也可以提高应用程序的效率。

时间: 2024-10-19 09:11:49

线程(Thread)、线程池(ThreadPool)技术的相关文章

43_2013年11月22日 线程池 Socket(Thread Lock Process 摇奖 线程池ThreadPool)

1>模拟线程池,生产者消费者问题 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Product { class Program { static void Main(string[] args) { //创建一个池子 MyConncetion[]

多线程Thread,线程池ThreadPool

首先我们先增加一个公用方法DoSomethingLong(string name),这个方法下面的举例中都有可能用到 1 #region Private Method 2 /// <summary> 3 /// 一个比较耗时耗资源的私有方法 4 /// </summary> 5 /// <param name="name"></param> 6 private void DoSomethingLong(string name) 7 { 8

.NET 线程池编程技术

摘要 深度探索 Microsoft .NET提供的线程池, 揭示什么情况下你需要用线程池以及 .NET框架下的线程池是如何实现的,并告诉你如何去使用线程池. 内容 介绍 .NET中的线程池 线程池中执行的函数 使用定时器 同步对象的执行 异步I/O操作 监视线程池 死锁 有关安全性 结束 介绍 如果你有在任何编程语言下的多线程编程经验的话,你肯定已经非常熟悉一些典型的范例.通常,多线程编程与基于用户界面的应用联系在一起,它们需要在不影响终端用户的情况下,执行一些耗时的操作.取出任何一本参考书,打

池化技术——自定义线程池

目录 池化技术--自定义线程池 1.为什么要使用线程池? 1.1.池化技术的特点: 1.2.线程池的好处: 1.3.如何自定义一个线程池 2.三大方法 2.1.单个线程的线程池方法 2.2.固定的线程池的大小的方法 2.3.可伸缩的线程池的方法 2.4.完整的测试代码为: 3.为什么要自定义线程池?三大方法创建线程池的弊端分析 4.七大参数 5.如何手动的去创建一个线程池 6.四种拒绝策略 6.1.会抛出异常的拒绝策略 6.2.哪来的去哪里拒绝策略 6.3.丢掉任务拒绝策略 6.4.尝试竞争拒绝

C#多线程学习 之 线程池[ThreadPool](转)

在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPool(线程池)来解决: 另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒                   这一般使用Timer(定时器)来解决: 本篇文章单单讲线程池[ThreadPool] ThreadPool类 MSDN帮助信息: http://msdn.microsoft.com/z

使用C++11封装线程池ThreadPool

读本文之前,请务必阅读: 使用C++11的function/bind组件封装Thread以及回调函数的使用 Linux组件封装(五)一个生产者消费者问题示例   线程池本质上是一个生产者消费者模型,所以请熟悉这篇文章:Linux组件封装(五)一个生产者消费者问题示例. 在ThreadPool中,物品为计算任务,消费者为pool内的线程,而生产者则是调用线程池的每个函数. 搞清了这一点,我们很容易就需要得出,ThreadPool需要一把互斥锁和两个同步变量,实现同步与互斥. 存储任务,当然需要一个

多线程系列(2)线程池ThreadPool

上一篇文章我们总结了多线程最基础的知识点Thread,我们知道了如何开启一个新的异步线程去做一些事情.可是当我们要开启很多线程的时候,如果仍然使用Thread我们需要去管理每一个线程的启动,挂起和终止,显然是很麻烦的一件事情.还好.net framework为我们提供了线程池ThreadPool来帮助我们来管理这些线程,这样我们就不再需要手动地去终止这些线程.这一篇文章就让我们来学习一下线程池ThreadPool吧.关于它我想从以下几个方面进行总结. 认识线程池ThreadPool Thread

C#多线程学习 之 线程池[ThreadPool]

在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPool(线程池)来解决: 另一种情况:线程平时都处于休眠状态,只是周期性地被唤醒                   这一般使用Timer(定时器)来解决: 本篇文章单单讲线程池[ThreadPool] ThreadPool类 MSDN帮助信息: http://msdn.microsoft.com/z

多线程二:线程池(ThreadPool)

在上一篇中我们讲解了多线程的一些基本概念,并举了一些例子,在本章中我们将会讲解线程池:ThreadPool. 在开始讲解ThreadPool之前,我们先用下面的例子来回顾一下以前讲过的Thread. 1 private void Threads_Click(object sender, EventArgs e) 2 { 3 Console.WriteLine($"****************btnThreads_Click Start {Thread.CurrentThread.Manage

python3 线程池-threadpool模块与concurrent.futures模块

一. 既然多线程可以缩短程序运行时间,那么,是不是线程数量越多越好呢? 显然,并不是,每一个线程的从生成到消亡也是需要时间和资源的,太多的线程会占用过多的系统资源(内存开销,cpu开销),而且生成太多的线程时间也是可观的,很可能会得不偿失,这里给出一个最佳线程数量的计算方式: 最佳线程数的获取: 1.通过用户慢慢递增来进行性能压测,观察QPS(即每秒的响应请求数,也即是最大吞吐能力.),响应时间 2.根据公式计算:服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * c