首页 > 其他分享 >线程池

线程池

时间:2023-08-26 23:22:39浏览次数:19  
标签:封装 函数 队列 任务 线程 多线程

什么是线程池

一般来说,我们使用一个线程的时候就去创建一个线程,当执行完任务后就将线程销毁。如果并发的线程很多,频繁的创建和销毁线程会降低效率。
为了实现线程的复用,即执行完一个任务后不被销毁,继续执行其他任务,我们就可以创建一个线程池。
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。


每个线程就类似于浏览器中新开了一个标签页,后台执行任务

线程池的组成

任务以及任务队列

任务

封装了一个结构体,包含任务的处理函数以及函数需要的参数

struct Task
{
	//回调函数,说明如何处理任务
	void* function(void* arg);
	//回调函数需要的参数,如果需要多个参数,那么就封装成一个结构体,传入这个结构体
	void* arg;
};

任务队列

封装了一个类,类中封装了一个队列储存Task,同时封装了一些相关的函数:往队列中添加任务、取出任务、获取队列中任务个数。并且因为很多线程都要从队列中取出任务,我们不希望多个线程同时操作任务队列,所以还要封装一把互斥锁进去

管理者线程

管理者线程只有一个
定时查看线程池中工作线程的情况,如果空闲的工作线程太多,就销毁一些工作线程,如果任务数量比工作线程数量多,就添加一些工作线程。
依据manager函数行动

工作线程

工作线程有多个
负责从任务队列中取出Task
依据worker函数行动

标签:封装,函数,队列,任务,线程,多线程
From: https://www.cnblogs.com/beishangeyu/p/17659523.html

相关文章

  • 02 程序,进程,线程
    程序——>进程——>线程程序:静态的进程:动态的,程序运行起来的的过程线程:由一个或者多个线程组成进程。eg:运行qq是一个进程,但有着很多的线程......
  • Windows线程API —CreateTimerQueueTimer/DeleteTimerQueueTimer的使用
    问题代码:1#include<windows.h>2#include<iostream>3#include<thread>4HANDLEh1;5HANDLEh2;67voidCALLBACKtest(PVOIDa,BOOLEANb)8{9std::cout<<"ThisatestfunctionexcutedbyThread:"<<......
  • 无涯教程-Python - 多线程
    运行多个线程类似于同时运行多个不同的程序,但具有以下优点-一个进程中的多个线程与主线程共享相同的数据空间,因此比起单进程,它们可以更轻松地共享信息或彼此通信。有时称为轻量级进程的线程,它们不需要太多的内存开销。开始新线程要生成另一个线程,您需要调用thread模块中可......
  • Python多线程
    当进行多线程编程时,涉及到以下几个关键概念和操作多线程是指在一个进程中同时运行多个线程,每个线程都可以执行不同的任务。线程是操作系统能够进行运算调度的最小单位,它是进程中的一个实体,可以被操作系统独立调度。以下是与多线程相关的一些核心概念:1.**进程和线程**:-进程......
  • 线程和进程区别
    什么是线程和进程?进程一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。线程进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运......
  • 线程协作
    线程协作1.生产者消费者模式应用场景假设仓库中只能存放一件产品﹐生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费。如果仓库中没有产品﹐则生产者将产品放入仓库﹐否则停止生产并等待,直到仓库中的产品被消费者取走为止。如果仓库中放有产品﹐则消费者可以将产品......
  • 线程池异常处理
    背景:有时候我们把一些业务逻辑丢在线程池处理,本身的业务方法又没有打印日志,导致这个方法执行过程中是否出错了根本不知道,异常信息基本丢失,问题不好排除。方式一简单粗暴trycatch执行的方法@TestpublicvoidtestThreadException(){ThreadPoolExecutorthre......
  • WPF中窗口控件的跨线程调用
    在多线程里面,UI是不能直接跨线程使用的。在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls=false;即可。在WPF中要设置Dispatcher属性。msg为要输出的内容privatedelegatevoidoutputDelegate(stringmsg);privatev......
  • java线程池
    Executors创建线程的4种方法//1.newSingleThreadExecutor创建“单线程化线程池”//特点://单线程化的线程池中的任务是按照提交的次序顺序执行的。//只有一个线程的线程池。//池中的唯一线程的存活时间是无限的。//......
  • 线程优先级
    线程优先级Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行。线程的优先级用数字表示,范围从1~10.Thread.MIN_PRIORITY=1;Thread.MAX_PRIORITY=10;Thread.NORM_PRIORITY=5;使用以下方式改变或......