线程池

C++11 实现线程池

六眼飞鱼酱① 提交于 2020-02-29 12:28:32
什么是线程池 线程池(thread pool)是一种线程使用模式。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着管理器分配可并发执行的任务。这 避免了在处理短时间任务时创建与销毁线程的代价 ,以及保证了线程的可复用性。线程池不仅能够保证内核的充分利用,还能防止过分调度。 线程池原理 预先创建预定数量的线程,将多个任务加入到任务队列。类似于生产者消费者,多个线程相当于消费者,一个任务队列充当生产者。当任务队列被塞入任务时,线程们就去竞争这些任务,但每次只有一个线程能够得到任务,该任务执行完成后,线程可以释放出来去承接下一个任务,这样保证多个任务可以并发地执行。 线程池的原理如图所示 一个任务队列有n个任务,可以通过线程池的调度分配到m个线程上去并发执行 线程池实现 机遇C++11 的线程库编写 thread_pool.hpp # ifndef _THREAD_POOL_H_ # define _THREAD_POOL_H_ # include <thread> # include <mutex> # include <atomic> # include <condition_variable> # include <functional> # include <vector> # include <queue> class

Java 并发 – 第七部分:Executors 与线程池

ぐ巨炮叔叔 提交于 2020-02-29 09:50:10
现在让我们开始 Java 并发系列的新篇章。这壹次我们会学习如何干净的启动壹個新线程,以及如何在线程池中管理它。在 Java 中,假设你有壹個像下面这样的 Runnable 线程: Runnable runnable = new Runnable(){ public void run(){ System.out.println("Run"); } } 你可以简单的在壹個线程中运行它: new Thread(runnable).start(); 这個代码很简洁,但是如果我们想并行的启动多個任务该怎么办呢,而且我们还想等待所有任务完成之后获取所有任务的返回值,这样的话,要想保持较好的代码风格实际上有点困难了。不过,就像所有其它的难题壹样,Java 为我们提供了壹個解决方案,那就是 Executor ,这個简单的类允许你创建线程池和线程工厂。 ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { executor.execute(new Runnable() { public void run() { System.out.println("do something here..."); } }); } executor.shutdown(); 线程池实际表现为

python语法基础-并发编程-线程-线程池

核能气质少年 提交于 2020-02-29 08:55:32
############### 线程池 ############## """ 池 —— concurrent.futures Python标准模块--concurrent.futures concurrent.futures模块提供了高度封装的异步调用接口,其中: ThreadPoolExecutor:线程池 ProcessPoolExecutor: 进程池 借助上面两个类,我们可以很方便地创建进程池对象和线程池对象。 p_pool = ProcessPoolExecutor(max_workers=5) # 创建一个最多5个woker的进程池 t_pool = ThreadPoolExecutor(max_workers=5) # 创建一个最多5个woker的线程池 可用方法介绍: # 基本方法 # submit(fn, *args, **kwargs) 提交任务 # map(func, *iterables, timeout=None, chunksize=1) 取代for循环submit的操作 # shutdown(wait=True) 相当于进程池的pool.close()+pool.join()操作 wait=True,等待池内所有任务执行完毕回收完资源后才继续 wait=False,立即返回,并不会等待池内的任务执行完毕 但不管wait参数为何值

尽可能的说明白ThreadPoolExecutor的原理

a 夏天 提交于 2020-02-29 03:04:34
线程池用来执行任务的,是通过创建线程来执行任务的,这个线程什么时候被创建呢,是在内部类Worker的构造函数中才会被创建。这个线程的作用就是不停的从阻塞队列中获取任务然后执行。 问:线程池是如何创建线程的? 答:在Worker类的构造函数里。 问:Worker什么时候会被构造? 答:是在方法 addWorker() 中。 问:线程池的线程启动之后用来做什么? 答:会调用 runWorker() 方法。 线程池的状态机 RUNNING:运行状态,接受新的任务,处理等待队列中的任务 SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务 STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程 TIDYING:所有的任务都销毁了,workCount 为 0。线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated() TERMINATED:terminated() 方法结束后,线程池的状态就会变成这个 RUNNING 定义为 -1,SHUTDOWN 定义为 0,其他的都比 0 大,所以等于 0 的时候不能提交任务,大于 0 的话,连正在执行的任务也需要中断。 RUNNING < SHUTDOWN < STOP < TIDYING < TERMINATED Worker

线程池原理及应用

六月ゝ 毕业季﹏ 提交于 2020-02-29 01:37:35
一、线程池的创建和常用参数分析 先看一个线程池的创建 private static void testThreadPool ( ) { ExecutorService executorService = Executors . newFixedThreadPool ( 1 ) ; Future < ? > future = executorService . submit ( ( ) - > { System . out . println ( Thread . currentThread ( ) . getName ( ) + " running" ) ; } ) ; } 翻看newFixedThreadPool()的源码可以看到最终执行的时候有以下几个参数: public ThreadPoolExecutor ( int corePoolSize , int maximumPoolSize , long keepAliveTime , TimeUnit unit , BlockingQueue < Runnable > workQueue , ThreadFactory threadFactory , RejectedExecutionHandler handler ) { . . . } a) corePoolSize 核心线程数,保持在线程池中线程的数量 b)

Java多线程和并发基础面试题

懵懂的女人 提交于 2020-02-28 23:06:41
本文帮助大家掌握Java多线程基础知识来对应日后碰到的问题,具体内容如下 一、Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。 2. 多线程编程的好处是什么? 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。多个线程共享堆内存(heap memory),因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子,Servlets比CGI更好,是因为Servlets支持多线程而CGI不支持。 3. 用户线程和守护线程有什么区别? 当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。 4. 我们如何创建一个线程? 有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类

线程池的监控

早过忘川 提交于 2020-02-28 14:31:40
线程池配置核心业务线程池和非核心业务线程池 核心业务的线程不够用 可以停掉非核心业务占用的线程 application.properties #线程池配置 gmall.pool.coreSize=8 gmall.pool.maximumPoolSize=100 gmall.pool.queueSize=1000000 PoolProperties :读取配置文件的值 package com . xiepanpan . gmall . portal . config ; import lombok . Data ; import org . springframework . boot . context . properties . ConfigurationProperties ; import org . springframework . context . annotation . Configuration ; /** * @author: xiepanpan * @Date: 2020/2/27 * @Description: 线程池配置参数 */ @Data @Configuration @ConfigurationProperties ( prefix = "gmall.pool" ) public class PoolProperties { private

java常用的几种线程池比较

微笑、不失礼 提交于 2020-02-28 10:46:57
1. 为什么使用线程池 诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 HTTP、FTP 或 POP)、通过 JMS 队列或者可能通过轮询数据库。不管请求如何到达,服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的。 构建服务器应用程序的一个简单模型是:每当一个请求到达就创建一个新线程,然后在新线程中为请求服务。实际上对于原型开发这种方法工作得很好,但如果试图部署以这种方式运行的服务器应用程序,那么这种方法的严重不足就很明显。每个请求对应一个线程(thread-per-request)方法的不足之一是:为每个请求创建一个新线程的开销很大;为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。 除了创建和销毁线程的开销之外,活动的线程也消耗系统资源。在一个 JVM 里创建太多的线程可能会导致系统由于过度消耗内存而用完内存或“切换过度”。为了防止资源不足,服务器应用程序需要一些办法来限制任何给定时刻处理的请求数目。 线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是

26_线程池_ThreadPoolExecutor

佐手、 提交于 2020-02-28 07:13:08
【ThreadPoolExecutor简述】 无论是Executors类的newFixedThreadPool()、newSingleThreadExecutor(),还是newCachedThreadPool()方法,虽然看起来创建的线程有着完全不同的特点,期内部实现均使用了ThreadPoolExecutor实现。 下面展示一下Executors类中对应的以上几个静态方法的源码: [ newFixedThreadPool()方法 ] [ newSingleThreadExecutor()方法] [ newCachedThreadPool()方法 ] 【ThreadPoolExecutor构造方法】 以上线程池的实现代码可以看到,他们都是ThreadPoolExecutor类的封装。 ThreadPoolExecutor类功提供了四个构造方法 public class ThreadPoolExecutor extends AbstractExecutorService { public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue); public