线程池

转:Netty服务器线程模型概览

你离开我真会死。 提交于 2020-04-02 14:51:01
一切从ServerBootstrap开始 ServerBootstrap 负责初始话netty服务器,并且开始监听端口的socket请求。 Java代码 bootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), //boss线程池 Executors.newCachedThreadPool() //worker线程池 ) ); bootstrap.setPipelineFactory( new HttpChannelPipelineFactory()); bootstrap.setOption( "child.tcpNoDelay" , true ); bootstrap.setOption( "child.keepAlive" , true ); bootstrap.bind( new InetSocketAddress(httpPort)); //端口开始监听 ServerBootstrap 用一个ServerSocketChannelFactory 来实例化。ServerSocketChannelFactory 有两种选择,一种是NioServerSocketChannelFactory

防雪崩利器:熔断器 Hystrix 的原理与使用

烂漫一生 提交于 2020-03-31 17:34:36
前言 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩, 一种常见的做法是手动服务降级. 而Hystrix的出现,给我们提供了另一种选择. 服务雪崩效应的定义 服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程.如果所示: 上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的不可用,引起B的不可用,并将不可用逐渐放大C和D时, 服务雪崩就形成了. 服务雪崩效应形成的原因 我把服务雪崩的参与者简化为 服务提供者 和 服务调用者 , 并将服务雪崩产生的过程分为以下三个阶段来分析形成的原因: 服务提供者不可用 重试加大流量 服务调用者不可用 服务雪崩的每个阶段都可能由不同的原因造成, 比如造成 服务不可用 的原因有: 硬件故障 程序Bug 缓存击穿 用户大量请求 硬件故障可能为硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问. 缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用. 在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用. 而形成 重试加大流量 的原因有: 用户重试 代码逻辑重试

06:线程池

六月ゝ 毕业季﹏ 提交于 2020-03-30 22:48:15
1:线程池原理-基本概念: 1:线程池管理器:用户管理线程池。包括创建线程池、销毁线程池,添加新任务等。 2:工作线程:工作线程就是线程池中实际工作的线程。没有任务时:处于等待状态,有任务时:可以循环的执行任务。 3:任务接口:每个任务都需要实现的接口。规范了任务的输入、输出等。 4:任务队列:任务太多时,超过了线程池处理能力。将待处理的任务放到等待队列中。 2:线程池接口和实现类: 1:接口:Executor:最上层的接口:定义了执行任务的方法:executor() 2:接口:ExecutorService:继承了Executor接口,扩展了Callable,Future,关闭方法。 3:接口:ScheduledExecutorService:继承了ExecutorService,怎加了定时任务相关的方法。 4:实现类:ThreadPoolExecutor:标准的线程池实现。但是比较基础。 5:实现类:ScheduledThreadPoolExecutor:继承了ThreadPoolExecutor,实现了ScheduledExecutorService。也就是说:在标准的线程池类基础上怎加了定时任务。 3:ThreadPoolExecutorc测试: /** * 1:核心线程数量5,最大数量10,无界队列,超出核心线程数量的线程存活时间5秒。 */ //

JAVA 面试须知

这一生的挚爱 提交于 2020-03-30 18:21:31
本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺。 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? (1)boolean boolean数据类型非true即false。这个数据类型表示1 bit的信息,但是它的大小并没有精确定义。 《Java虚拟机规范》中如是说:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型单独使用是4个字节,在数组中又是1个字节。那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗?实际上,使用int的原因是,对于当下32位的CPU来说,一次进行32位的数据交换更加高效。 综上,我们可以知道:官方文档对boolean类型没有给出精确的定义,《Java虚拟机规范》给出了“单独时使用4个字节,boolean数组时1个字节”的定义,具体还要看虚拟机实现是否按照规范来

面试刷题20:并发包中的线程池有哪些?

纵然是瞬间 提交于 2020-03-30 17:29:32
java提供的线程池可以简化线程管理,提高线程资源的利用率。 大家好,我是李福春,今天的题目是: Java提供了哪些线程池?如何设置合适的线程池大小? 答:java.util.concurrent包中提供了5种线程池,从简单到复杂列举如下: 一,newSingleThreadExecutor() ,单线程池,任何时候工作线程都是1个,队列是无界队列保证任务的顺序执行; 二,newFixedThreadPool(int),固定数量的线程池,任何时候工作线程都是N,内部使用的无界队列; 三,newCachedThreadPool()缓存线程池,适合处理大量短时间执行的任务; 四,newWorkStealingPool(int)工作窃取线程池,java8引入,内部使用ForkJoinPool实现 五,newScheduledThreadPool(),适合处理定时或者周期性的任务 如何合理设置线程池大小? 需要综合计算任务的特点来。 cpu耗费较高的,核心线程数一般设置为N(cpu核心数) 等待任务较多的,核心线程数一般设置为 N cpu利用率 (1+平均等待时间/平均执行时间) 同时在使用线程池的时候,注意一下5点: 1, 避免任务堆积 2,避免过度扩展线程,以及避免线程泄露; 3,避免死锁,合理使用各种锁; 4,避免使用ThreadLocal; 线程池参数 线程池的结构如下图:

Java面试知识点总结

纵饮孤独 提交于 2020-03-30 16:09:29
Java面试知识点总结 本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺(阅读本文需要有一定的Java基础;若您初涉Java,可以通过这些问题建立起对Java初步的印象,待有了一定基础后再后过头来看收获会更大)。本文的问题列表来自于http://www.nowcoder.com/discuss/3043,在此感谢原作者的无私分享:) 1. Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? (1)boolean boolean数据类型非true即false。这个数据类型表示1 bit的信息,但是它的大小并没有精确定义。 《Java虚拟机规范》中如是说:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出 boolean类型单独使用是4个字节,在数组中又是1个字节。 那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗

深入浅出Java(Android )线程池ThreadPoolExecutor

血红的双手。 提交于 2020-03-30 15:26:01
前言 关于线程池 在Java/Android开发中,设计到并发的请求,那基本上是离不开线程池了。用线程池的好处: 1、减少线程频繁创建、销毁的开销; 2、好控制并发量,降低OOM的可能,至于原因文中会说; 3、提高程序的响应速度,因为可以省去部分创建的过程; 要不要深度学习线程池 对于服务端的同学来说应该会比较重视这一块,因为需要做高并发;而移动端的同学可能比较容易忽略这一块。有些人觉得平时也用不到,移动端没有那么大并发量,或者说第三方框架中已经完成了,比如 OkHtttp ; 其实只能说有这种想法的同学还没有遇到大一点的项目或者说没有太多多线程优化的经验。 如果你真的遇到了这种项目瓶颈,你连线程池的运行原理都不知道,那又如何解决项目问题呢? 如果你要寻求一份中高级开发工程师的工作,那线程池是基本是必问题目之一,而且还要有一定深度。 如何深度学习线程池 这也是我们今天的重点,本文将从下面几点带大家快速掌握线程池的要点: 1、从API使用到原码解析,基于JDK1.8版本; 2、从源码阅读(深入)中总结出(浅出)线程池工作原理; 3、对应用场景的分析以及异常处理 预览 线程池类图.png 先对线程池的部分核心类/接口做个简介,大家有个印象就好。 Executor接口 public interface Executor { /** * 就一个方法,用来执行线程任务的

并发编程面试题

蹲街弑〆低调 提交于 2020-03-29 18:32:53
1.进程和线程还有协程之间的关系   进程:     进程简单理解就是我们平常使用的程序,如QQ,浏览器,网盘等。进程拥有自己独立的内存空间地址,     拥有一个以上的线程。   线程:     线程可以理解为轻量级的进程,是程序执行的最小单元。在某个进程启动后,会默认产生一个主线程,     主线程可以创建多个子线程,   协成:     协成,又称微线程,纤程。协成是一个线程执行,但执行有点像多线程,协成的执行效率极高     简单点说协成是进程和 线程的升级版,进程喝 线程都面临着内内核态和用户态的切换问题而     耗费许多切换时间 ,而且协成就是用户自己控制切换的时机,不再需要 陷入系统的内核态。   一个程序至少有一个进程 ,一个进项至少有一个线程。线程不能独立执行,必须依存在进程中。   协成,应用程序级别(而非操作系统)控制切换,以此来提升 效率。 2.并发和并行之间的区别   并行(parallel):         指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是宏观 来看         二者都是一起执行的。            小结:     当系统有一个以上 CPU 时,则线程的操作有可能非并发。当一个 CPU 执行一个线程时,另一个      CPU 可以执行另一个线程,两个线程互不抢占 CPU 资源,可以同时进行

线程池

对着背影说爱祢 提交于 2020-03-29 12:18:37
线程,是程序执行的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。以上概念来自于百度百科。对于开发者来说,线程就是帮我们干实事的伙伴。在Java中,对于线程的基本操作,我们知道在代码中有以下三种写法: (1)自定义一个类,去继承Thread类,重写run方法 (2)自定义一个类,去实现Runnable接口,重写run方法 (3)自定义一个类,实现Callable接口,重写call方法。关于这个Callable,要多提一嘴,首先,Callable规定的方法是call(),而Runnable规定的方法是run().;其次,Callable的任务执行后可返回值,而Runnable的任务是不能返回值的;然后,call()方法可抛出异常,而run()方法是不能抛出异常的;最后,运行Callable任务可拿到一个Future对象。 实现Callable接口 因为线程的基本概念和使用大家基本上都很熟悉,所以这里就点到为止。 关于线程,就不得不提及另外一个经常容易被混淆的概念,那就是并行和并发。 关于并行和并发

自已写的线程池

老子叫甜甜 提交于 2020-03-29 00:49:47
C#有ThreadPool和Task,为什么还要自己写线程池?我以前也没想过自己写线程池,都是用ThreadPool或Task,前段时间写爬虫,我想控制10个线程爬网页、10个线程下载网页上的图片,不然的话因为网页很多,图片相对较少,可能大部分线程都在爬网页,少量线程在下载图片,这样下载图片的速度慢了,所以我想到了自己写线程池MyThreadPool,再配合ThreadPool使用,精确控制爬网页和下载图片的线程数。不过这个线程池写的比较简单,缺点是线程池会瞬间创建最大数量的工作线程。 线程池类代码: using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace Utils { /// <summary> /// 线程池 /// </summary> public static class MyThreadPool { /// <summary> /// 最大工作线程数 /// </summary> private static int m_WorkerThreads = 5; /// <summary> /// 线程队列 /// <