线程池

线程池

孤街醉人 提交于 2020-03-05 22:38:54
线程池优势: a、降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗; b、提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行; c、方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场)); d、提供更强大的功能,延时定时线程池; 线程池的主要参数: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); } a、corePoolSize(线程池基本大小):当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务

02_Java语音进阶||day07_等待与唤醒案例、线程池、Lambda表达式

走远了吗. 提交于 2020-03-05 21:55:28
第一章 等待唤醒机制 1.1 线程间通信 概念: 多个线程在处理同一个资源 (包子), 但是处理的动作(线程的任务)却不相同。 比如: 线程A用来生产包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么 线程A与线程B之间 就存在 线程通信问题 1.2 等待唤醒机制 等待与唤醒机制: 线程之间的通信 【重点】:有效的利用资源[包子] (生产一个包子,吃一个包子,再生产一个包子,再吃一个包子) 通信:对包子的状态进行判断 * ==没有==包子-->吃货线程唤醒包子铺线程-->吃货线程等待-->包子铺线程做包子-->做好包子-->修改包子的状态==有== * ==有==包子-->包子铺线程唤醒吃货线程-->包子铺线程等待-->吃货线程吃包子-->修改包子的状态==没有== * ==没有==包子-->吃货线程唤醒包子铺线程-->吃货线程等待-->包子铺线程做包子-->做好包子-->修改包子的状态==有== * ... 等待唤醒中的方法 void wait () 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。 void notify () 唤醒在此对象监视器上等待的 单个线程 。 注:会继续执行wait方法之后的代码 void notifyAll () 唤醒在此对象监视器上等待的

根据CPU核心数确定线程池并发线程数

浪尽此生 提交于 2020-03-05 17:46:53
一、抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:《Java Concurrency in Practice》即《java并发编程实践》,如下图: 如上图,在《Java Concurrency in Practice》一书中,给出了估算线程池大小的公式: Nthreads=Ncpu*Ucpu*(1+w/c) ,其中 Ncpu=CPU核心数 Ucpu=cpu使用率,0~1 W/C=等待时间与计算时间的比率 第二派:《Programming Concurrency on the JVM Mastering》即《Java 虚拟机并发编程》 线程数=Ncpu/(1-阻塞系数) 二、分析 对于派系一,假设cpu100%运转,即撇开CPU使用率这个因素,线程数 =Ncpu*(1+w/c)。 现在假设将派系二的公式等于派系一公式,即 Ncpu/(1-阻塞系数)= Ncpu*(1+w/c) ,===》 阻塞系数=w/(w+c),即阻塞系数=阻塞时间/(阻塞时间+计算时间),这个结论在派系二后续中得到应征,如下图: 由此可见,派系一和派系二其实是一个公式......这样我就放心了...... 三、实际应用 那么实际使用中并发线程数如何设置呢?分析如下(我们以派系一公式为例): Nthreads=Ncpu*(1+w/c)

网络编程py

徘徊边缘 提交于 2020-03-05 15:13:10
概念 day27 ​ 网络架构 ​ C/S :qq 微信 浏览器 英雄联盟 穿越火线 王者荣耀 安装 ​ C:client 客户端 ​ S:server 服务端 ​ B/S :百度 淘宝 码云 只要在浏览器输入网址就可以直接使用了 ​ B:browser 浏览器 ​ S:server 服务端 ​ B/S更好: 更节省资源 不用更新 不依赖环境 ​ 统一了所有web程序的入口 ​ C/S架构: 安全性 程序比较庞大 ​ 移动端 ​ app ​ 微信小程序 : 统一了所有web程序的入口 ​ 支付宝 : 统一了所有和钱相关的事儿 ​ mac ​ 是一个物理地址 ​ 唯一的标识你的网络设备 ​ ip 地址 ​ 是一个逻辑地址 ​ 是可以根据你的位置变化发生改变的 ​ 能够在广域网中快速的定位你 ​ ipv4地址: ​ 4为点分十进制 ​ 0.0.0.0-255.255.255.255 ​ 2**32 ​ 公网和内网: ​ 公网 0.0.0.0-255.255.255.255(不包含保留字段的ip) 你能够在任意一 个地方去访问的ip地址 ​ 内网 所有的内网ip都要使用保留字段 只能在一个区域内使用,出了 这个区域就用不了了 192.168.0.0 - 192.168.255.255 10.0.0.0 - 10.255.255.255 172.16.0.0 - 172.32.255

JAVA学习要点总结

落花浮王杯 提交于 2020-03-05 09:38:26
文章目录 缓存 memcache的分布式原理 memcache的内存分配机制 如何存放数据到memcached缓存中?(memcache内存分配机制) memcache的惰性失效机制 memcache缓存的无底洞现象 一致性Hash算法的实现原理 Hash环 一致性Hash算法 Hash环的倾斜 虚拟节点解决Hash环倾斜 hash算法平衡性 memcached与redis的区别 Redis的主从复制 Redis的部分复制过程 Redis的主从复制阻塞模式 Redis的数据持久化方式 Redis的高可用部署方式 哨兵模式 Redis哨兵主要功能 Redis哨兵的高可用 哨兵如何判断redis主从节点是否正常? 集群模式 Redis可以在线扩容吗?zk呢 Redis高并发和快速的原因 浏览器本地缓存的了解和使用 缓存雪崩 缓存穿透 HashMap HashMap的Hash碰撞 HashMap的get和put原理 HashMap的rehash HashMap的线程不安全问题 HashMap和Hashtable的区别 为什么collection没有实现clonable接口 为什map没有实现collection接口 Map接口的实现有哪些,区别是什么 线程池 Executors框架的四种线程池及拒绝策略 四种线程池 JDK拒绝策略 Reactor模式 Reactor单线程模型

并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析

怎甘沉沦 提交于 2020-03-05 01:50:12
在上一篇线程池的文章 《并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)》 中从ThreadPoolExecutor源码分析了其运行机制。限于篇幅,留下了ScheduledThreadPoolExecutor未做分析,因此本文继续从源代码出发分析ScheduledThreadPoolExecutor的内部原理。 类声明 1 public class ScheduledThreadPoolExecutor 2 extends ThreadPoolExecutor 3 implements ScheduledExecutorService { ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,实现了ScheduledExecutorService。因此它具有ThreadPoolExecutor的所有能力。所不同的是它具有定时执行,以周期或间隔循环执行任务等功能。 这里我们先看下ScheduledExecutorService的源码: ScheduledExecutorService 1 //可调度的执行者服务接口 2 public interface ScheduledExecutorService extends ExecutorService { 3 4 //指定时延后调度执行任务,只执行一次,没有返回值 5

深入理解 Java 线程池:ThreadPoolExecutor

妖精的绣舞 提交于 2020-03-05 01:48:35
线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。 那么有没有一种办法使执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢? 这就是线程池的目的了。线程池为线程生命周期的开销和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 什么时候使用线程池? 单个任务处理时间比较短 需要处理的任务数量很大 使用线程池的好处 引用自 ifeve.com/java-thread… 的说明: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 Java中的线程池是用ThreadPoolExecutor类来实现的. 本文就结合JDK 1.8对该类的源码来分析一下这个类内部对于线程的创建,

Java编程进阶之:线程池以及Lambda

霸气de小男生 提交于 2020-03-04 18:56:52
今天给大家讲解下多线程的的用例。希望能帮到大家,请看下面的列子,谢谢! 线程池的使用 public static ExecutorService newFixedThreadPool(int nThreads); 得到一个线程对象,初始化参数是要求的当前线程池中的线程数 public Future submit(Runnable target); 从线程池中获取一个线程对象,并且执行给定的Runnable接口实现类对象作为执行目标 演示代码 package com.qfedu.b_executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; class MyThread1 implements Runnable { @Override public void run() { System.out.println("Runnable接口实现类,线程目标代码"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread

Java线程池-基础

流过昼夜 提交于 2020-03-04 17:59:30
线程池的核心类:ThreadPoolExecutor ,类图如下: (I:代表接口,C:代表实现类) I:Executor I:ExecutorService C:AbstractExecutorService C:ThreadPoolExecutor 构造函数: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler); 每个参数含义: 参数 含义 int corePoolSize 核心线程池的大小 int maximumPoolSize 线程池 最大的线程数量 long keepAliveTime 非核心线程能够空闲的最长时间 TimeUnit unit 时间单位,和keepAliveTime配合使用 BlockingQueue<Runnable> workQueue 缓存队列,用来存放等待被执行的任务 ThreadFactory threadFactory 线程工厂,用来创建线程,默认new Executors