线程池

Java线程池

久未见 提交于 2020-03-04 17:14:01
https://www.jianshu.com/p/0d9ef81aaa26 来源: CSDN 作者: spjhandsomeman 链接: https://blog.csdn.net/spjhandsomeman/article/details/104653158

@Async如何使用

[亡魂溺海] 提交于 2020-03-04 12:13:09
@Async注解 我们都知道使用@Async标注在方法上,可以使该方法异步的调用执行。而所有异步方法的实际执行是交给TaskExecutor的。 关于@Async的基本知识不做讲解,只是对于使用过程中需要的注意的点做下强调。 最简单的使用 1.启动类添加@EnableAsync注解 package com.lara.springbootconfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; /** * @author lara */ @SpringBootApplication @EnableAsync public class SpringBootConfigApplication { public static void main(String[] args) { SpringApplication.run(SpringBootConfigApplication.class, args); } } 2. 方法上添加 @Async ,类上添加@Component

自定义Java线程池

那年仲夏 提交于 2020-03-04 09:44:32
线程池创建的参数 在创建线程的各种方式中我们有讲到过通过创建线程池来完成异步操作,但实际上jdk提供的Executors来创建线程池都还有些缺陷,线程池有以下几个参数: 代码节选自源码ThreadPoolExecutor.java的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnitunit, BlockingQueueworkQueue, ThreadFactorythreadFactory, RejectedExecutionHandlerhandler) corePoolSize: 线程池中线程的个数,最少的个数,即使是空闲的,也会存在 maximumPoolSize: 线程池中允许的连接的最大个数 keepAliveTime: corePoolSize之外的线程,在没有任务时,最大存活时间 unit: keepAlveTime 的时间单位 workQueue: 在任务还没有执行前,保存Runnable任务的地方,也就是待执行任务队列 threadFactory: 线程工厂,可自定义线程生成的方式,可以自定义名字等等 handler:在线程池和队列满的时候,如何处理新到来的任务 jdk自带线程池的缺陷

多线程,线程通信,线程池和lambda表达式

随声附和 提交于 2020-03-04 03:29:05
多线程,线程通信,线程池和lambda表达式 1.多线程waiting(无限次等待) 此线程被执行wait时,需要等另一个线程唤醒 public void wait(); 所在线程进入等待并开启锁对象 public void notify(); 唤醒和锁有关的任意一个等待的线程,并开启锁 public void notifyAll(); 唤醒所有与锁有关的等待的线程并开启锁, 2.线程通信 多个完全无关的线程共享资源为同一个事物,需要解决共享资源问题,解决的办法是:创建多个线程对象时,使用同一个商品类对象,作为构造方法参数进行初始化操作 3. 线程池 继承Thread和遵从Runnable接口,都要重写Run方法,每一个线程对象只能执行一次,之后就被销毁。 利用Runnable接口来提供执行目标,而且借助于Thread执行线程。 线程池 ==> 可以容纳多个线程的容器,程序可以从线程池获取线程来完成目标代码,同时也可以将线程归还给线程池。省去了创建线程和销毁线程这样非常繁琐的操作。 使用方法 public static ExecutorService newFixedThreadPool(int nThreads); 得到一个线程对象,初始化参数是要求的当前线程池中的线程数 public Future submit(Runnable target); 从线程池中获取一个线程对象

ThreadPoolExecutor详解(二)

巧了我就是萌 提交于 2020-03-04 00:14:31
在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,但都有其局限性,不够灵活;另外由于前面几种方法内部也是通过ThreadPoolExecutor方式实现,使用ThreadPoolExecutor有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险。 下面我们就对ThreadPoolExecutor的使用方法进行一个详细的概述。 首先看下ThreadPoolExecutor的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory

java Spring Cloud服务容错保护 Hystrix【Finchley 版】-b2b2c小程序电子商务

孤人 提交于 2020-03-03 19:02:34
分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况,这种现象被称为服务雪崩效应。为了应对服务雪崩,一种常见的做法是手动服务降级。而 Hystrix 的出现,给我们提供了另一种选择。 Hystrix [hɪst’rɪks] 的中文含义是 “豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与 Hystrix 本身的功能不谋而合,因此 Netflix 团队将该框架命名为 Hystrix,并使用了对应的卡通形象做作为 logo。 服务雪崩效应 定义 服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程。如果所 示: 上图中,A 为服务提供者,B 为 A 的服务调用者,C 和 D 是 B 的服务调用者。当 A 的不可用,引起 B 的不可用,并将不可用逐渐放大 C 和 D 时,服务雪崩就形成了。 形成的原因 我把服务雪崩的参与者简化为 服务提供者 和 服务调用者,并将服务雪崩产生的过程分为以下三个阶段来分析形成的原因: 服务提供者不可用 重试加大流量 服务调用者不可用 服务雪崩的每个阶段都可能由不同的原因造成,比如造成 服务不可用 的原因有: 硬件故障 程序 Bug 缓存击穿 用户大量请求 硬件故障可能为硬件损坏造成的服务器主机宕机,网络硬件故障造成的服务提供者的不可访问。 缓存击穿一般发生在缓存应用重启

线程池阻塞

こ雲淡風輕ζ 提交于 2020-03-03 16:59:19
线程池的阻塞 问题 线程池的知识 回归问题 问题 今天碰到一个有意思的问题,我把它抽取出来: package thread_pool ; import java . util . concurrent . * ; public class TestThreadPool { public static void main ( String [ ] args ) { ExecutorService threadPoolExecutor = new ThreadPoolExecutor ( 2 , 5 , 2 L , TimeUnit . SECONDS , new ArrayBlockingQueue < > ( 3 ) , Executors . defaultThreadFactory ( ) , new ThreadPoolExecutor . AbortPolicy ( ) ) ; threadPoolExecutor . execute ( ( ) - > { System . out . println ( "the thread is running..." ) ; } ) ; } } 搞了个线程池,分配给它一个任务,就是打印一句话,控制台“ the thread is running”当然打印了,但是,程序没有结束: 问题是: 为什么阻塞了? 在哪里阻塞了?

线程池为啥要用阻塞队列

元气小坏坏 提交于 2020-03-03 00:44:52
线程池为啥要用阻塞队列 答:等待核心线程执完 提高线程复用性 相当于 核心线程数 执行完 有空闲线程 等待队列会把线程给核心线程数 提高线程复用性 如果用非阻塞式队列 核心线程数满了 他还会添加线程 导致崩溃 来源: CSDN 作者: 阿超� 链接: https://blog.csdn.net/weixin_44840595/article/details/103531271

以基于Reactor模式的高并发EchoServer为例剖析muduo库框架

£可爱£侵袭症+ 提交于 2020-03-02 17:40:49
前言 在讲解基于muduo库的高并发echo服务器之前,我们先来回顾一下我们一般编写基于Reactor模式的高并发服务器的基本流程。 muduo的EchoServer其实也是基于上述流程,只不过进行了一定程度地封装,本质上仍是Reactor模式。muduo的example中的echo服务器代码展示的是只有一个reactor的服务器,muduo其实支持one loop per thread + 线程池的模式,也即multiple reactors + 业务线程池的模式,也就是服务器同时有多个IO线程,其中Acceptor所在的IO线程成为mainReactor,其他的IO线程成为subReactor,mainReactor主要负责处理监听描述符listenfd的上的时间,也就是负责处理客户端的连接请求。而subReactor主要负责已连接描述符connfd上的事件,也就是在和客户端建立好连接之后负责处理和客户端的具体通信。mainReactor+subReactor是由多个IO线程实现的,在muduo库当中,其通过在IO线程池中设置是让其工作在单IO线程模式还是多IO线程模式。而所谓的业务线程池主要是指计算线程池,其主要负责处理具体的业务逻辑,不涉及具体的IO操作。 在认真阅读完一遍muduo库源码之后,我认为如果想基于muduo库编写一个单线程版的echo服务器

终止线程池线程的方法

北城余情 提交于 2020-03-02 17:17:48
终止线程池主要有两个方法:shutdown() 和 shutdownNow()。 shutdown()后线程池将变成shutdown状态,此时不接收新任务,但会处理完正在运行的 和 在阻塞队列中等待处理的任务。 shutdownNow()后线程池将变成stop状态,此时不接收新任务,不再处理在阻塞队列中等待的任务,还会尝试中断正在处理中的工作线程。 来源: oschina 链接: https://my.oschina.net/u/4167465/blog/3185227