线程池

java中的线程池简单介绍

倖福魔咒の 提交于 2020-03-07 13:46:11
尊重原创,本文转载自: https://blog.csdn.net/qq_33453910/article/details/81413285 阅读完本篇文章会知道如下三点: 1.进程-线程简单介绍 2.java的线程池是什么,有哪些类型,作用分别是什么 3.使用线程池的优点 1.进程-线程的简单介绍 进程 什么是进程呢? 进程是计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配的调度的基本单位,是操作系统结构的基础。简单来讲:进程是指运行中的应用程序,进程是一个实体,每一个进程都有它自己的地址空间。例如我们点击了QQ,就启动了一个进程,操作系统就会为这个进程分配独立的地址空间,当我们又点击浏览器,这样又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。 线程 什么是线程呢? 线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一个进程至少有一个线程。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。注意:线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属于一个进程的其他线程共享进程所拥有的全部资源,线程有就绪,阻塞,运行三种基本状态。 另外:在Unix System和SunOS中也被称为轻量进程,但轻量进程更多指内核线程,而把用户线程称为线程。 2

线程池

。_饼干妹妹 提交于 2020-03-07 12:48:08
文章目录 1.什么是线程池 2.为什么要用线程池? 3.执行execute()方法和submit()方法的区别 4. 如何创建线程池 5.ThreadPoolExecutor 类分析 5.1.参数分析 5.2.线程池饱和策略 6.一个简单的线程池Demo 7.线程池原理 线程池处理流程 结构 线程池状态 参考文章: 1.什么是线程池 学习编程的小伙伴们会经常听到“线程池”、“连接池”这类的词语,可是到底“池”是什么意思呢?我讲个故事大家就理解了:在很久很久以前有一家银行,一年之中只有一个客户来办理业务,随着时间的推移,办理业务的人数每年都增加五千。20年之后这家银行办理业务的人次已经到十万。最开始只有一个客户的时候银行只需要雇佣一个按办理业务次数计工资的临时工就行了,办完业务就解雇。随着办理业务的人不断增多,银行老板发现继续雇佣按次计费的员工太麻烦了,每天都在招人,又每天都解雇人。所以老板就想出了一个办法,雇佣几个员工一直在办事大厅待命,有顾客来的时候,柜员就给顾客办业务,办完一个之后再继续为下一个顾客办业务,如果没有下一个顾客就继续待命。就这样这个“聪明”的老板发明了“柜员池”。 线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的

Java线程池使用和常用参数

北战南征 提交于 2020-03-07 12:02:18
多线程问题: 1、java中为什么要使用多线程 使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源。 2、java中简单的实现多线程的方式 继承Thread类,重写run方法; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 class MyTread extends Thread{ public void run() {   System.out.println(Thread.currentThread().getName()); } } 实现Runable接口,实现run方法; class MyRunnable implements Runnable{    public void run() {     System.out.println(Thread.currentThread().getName());   } } class ThreadTest {    public static void main(String[] args) {     MyTread thread = new Mythread();     thread.start(); //开启一个线程     MyRunnable

伪异步IO理解

让人想犯罪 __ 提交于 2020-03-07 08:44:26
伪异步IO实在堵塞IO的基础上将每个client发送过来的请求由新创建的线程来处理改进为用线程池来处理。因此避免了为每个client请求创建一个新线程造成的资源耗尽问题。 来看一下伪异步IO的服务端代码: 线程池类 import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author zhouxuejun * * @date 2014年10月21日 上午10:05:43 */ public class TimerServerHandlerExecutePool { private ExecutorService executor; public TimerServerHandlerExecutePool(int maxPoolSize, int queueSize) { executor = new ThreadPoolExecutor(Runtime.getRuntime() .availableProcessors(), maxPoolSize, 120L,

JDK 伪异步编程(线程池)

喜欢而已 提交于 2020-03-07 08:44:14
伪异步IO编程 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接。在高性能服务器应用领域,往往需要面向成千上万个客户端的并发连接,这种模型显然无法满足高性能、高并发接入的场景。为了改进一线程一连接模型,后来又演进出了一种通过线程池或者消息队列实现1个或者多个线程处理N个客户端的模型,由于它的底层通信机制依然使用同步阻塞I/O,所以被称为“伪异步”。 为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远远大于N,通过线程池可以灵活的调配线程资源,设置线程的最大值,防止由于海量并发接入导致线程耗尽。 当有新的客户端接入的时候,将客户端的Socket封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃线程对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。 服务端示例: import java.io.IOException; import java.net

python之线程池

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-07 07:48:05
#!/user/bin/evn python # -*- coding:utf-8 -*- import threading import queue,time ''' 线程池的思路: 将任务依次放在队列里面 然后从队列取出任务交给线程执行 ''' stopEvent=object()#任务完了的标志---下面我们将任务包封装到元组中 class ThreadPool(object): def __init__(self,max_num): #创建队列 self.q=queue.Queue() #创建线程最大的数量(线程池的最大容量) self.max_num=max_num #空闲线程列表(数量) self.free_list=[] #真实创建的线程列表(数量) self.gemerate_list=[] #中断任务标志 self.terminal=False self.num=0 def run(self,func,args,callback=None): #func:任务函数 #args:任务函数的参数 #callback:线程执行成功或者失败后执行的回调函数 task=(func,args,callback)#将任务封装到元组中 ==任务包 #将任务包放到队列中 self.q.put(task) #创建线程 if len(self.free_list)==0 and len

KClient——kafka消息中间件源码解读

核能气质少年 提交于 2020-03-07 06:40:13
目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.KClientController top.ninwoo.kclient.app.handler.AnimalsHandler top.ninwoo.kclient.app.domain 总结 kclient-core top.ninwoo.kafka.kclient.boot.KClientBoot createObjectHandler createObjectsHandler createDocumentHandler createBeanHandler createBeansHandler invokeHandler 生产者和消费者创建方法 小结 top.ninwoo.kafka.kclient.boot.KafkaHandlerMeta top.ninwoo.kafka.kclient.core.KafkaProducer top.ninwoo.kafka.kclient.core.KafkaConsumer init() initAsyncThreadPool() initKafka startup() AbstractMessageTask

Python-线程池、进程池,协程

大憨熊 提交于 2020-03-06 20:48:37
线程池&进程池 在python2中没有提供,在python3之后才提供 作用:保证程序中最多可以创建的线程的个数 import time from concurrent.futures import ThreadPoolExecutordef task(n1,n2): time.sleep(1) print('星空不问赶路人')pool = ThreadPoolExecutor(10) # 创建线程池for i in range(100): pool.submit(task,i,1)pool.shutdown(True) # 等线程池中任务执行完毕之后,再继续往后走print('岁月不负有心人') import time from concurrent.futures import ThreadPoolExecutordef task(arg): time.sleep(1) print('星空不问赶路人') return '岁月不负有心人'ret = pool.map(task,range(1,20)) # 具有返回值print('end',ret)pool.shutdwon(True)for i in ret: print(i) # 直接输出i import timefrom concurrent.futures import ThreadPoolExecutordef task

线程池的学习和使用

亡梦爱人 提交于 2020-03-06 19:25:53
目录 什么是线程池 创建线程池 使用线程池 声明 ThreadFactory 创建线程池类 调用线程池 什么是线程池 线程池的作用是初始化一些线程,当有任务的时候,就从中启动一个来执行相关任务,执行完后,线程资源重新回收到线程池中,达到复用的效果,从而减少资源的开销 创建线程池 在JDK中, Executors 类已经帮我们封装了创建线程池的方法。 Executors.newFixedThreadPool(); Executors.newCachedThreadPool(); Executors.newScheduledThreadPool(); 但是点进去看的话, public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } 它的内部实现还是基于 ThreadPoolExecutor 来实现的。通过阿里代码规范插件扫描会提示我们用 ThreadPoolExecutor 去实现线程池。通过查看 ThreadPoolExecutor 的构造方法 public

【Java】第四十二节 线程池

痞子三分冷 提交于 2020-03-06 14:03:08
一、为什么要用线程池 1、提高程序的执行效率 如果程序中有大量短时间任务的线程任务,由于创建和销毁线程需要和底层操作系统交互,大量时间都耗费在创建和销毁线程上,因而比较浪费时间,系统效率很低;线程池里的每一个线程任务结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用,因而借助线程池可以提高程序的执行效率。 2、控制线程的数量,防止程序崩溃 如果不加限制地创建和启动线程很容易造成程序崩溃,比如高并发1000W个线程,JVM就需要有保存1000W个线程的空间,这样极易出现内存溢出;线程池中线程数量是一定的,可以有效避免出现内存溢出。 二、常用方法 在JDK5之前,必须手动才能实现线程池,从JDK5开始新增了一个Executors工厂类,通过该工厂类可以实现线程池,该类有如下常用方法: public static ExecutorService newFixedThreadPool(int nThreads) :创建一个可重用的、具有固定线程数的线程池 public static ExecutorService newCachedThreadPool() :创建一个具有缓存功能的线程池,系统根据需要创建线程,这些线程将会被缓存在线程池中 public static ExecutorService newSingleThreadExecutor()