线程
文章平均质量分 75
筏镜
这个作者很懒,什么都没留下…
展开
-
父线程变量需要传递到子线程使用一种方式InheritableThreadLocal和TransmittableThreadLocal
前言ThreadLocal是相对于每一个线程自己使用的本地变量,有这样的一种需求:父线程生成的变量需要传递到子线程中进行使用。需要使用新的InheritableThreadLocal类来实现,但InheritableThreadLocal的使用利用Thread 的初始化。我们经常在使用线程的时候,都是使用线程池的方式这个时候就需要TransmittableThreadLocal登场来解决。实践一、InheritableThreadLocal使用public class LocalThreadUti原创 2021-02-10 22:56:17 · 598 阅读 · 1 评论 -
线程池执行异常不打印日志
背景平时自己在使用的ThreadPoolExecutor的时候,提交任务用submit和execute方法用的比较随意,知道当需要获取返回结果的时候用submit。但当并不需要结果的时候submit和execute用得比较随意。在一次使用submit的时候并没有获得预期结果,但也没有异常日志输出。在进行一波调试之后,任务在线程中出现异常了,但也并未出现异常抛出的情况。代码测试1、先用execute 查看当出现异常的情况public class ThreadPoolTest { priv原创 2020-06-07 16:43:07 · 11669 阅读 · 0 评论 -
CyclicBarrier 线程同步器
CountDownLatch,Semaphore,CyclicBarrier 都是在 JUC 下包含了一些常用的同步工具类,其实将其放在一起介绍印象会更加深刻,由于对其了解使用的先后顺序,造成并没有一起来介绍。CountDownLatch:当一个线程调用await方法时,就会阻塞当前线程。每当有线程调用一次 countDown 方法时,计数就会减 1。当 count 的值等于 0 的时候,被阻塞的线程才会继续运行。CountDownLatch 的同步使用方法Semaphore:Semaphore原创 2020-05-08 22:35:29 · 264 阅读 · 1 评论 -
线程池的大小如何设置(美团技术给出动态更改线程大小的方案)
线程池大小的设置一直是在开发中比较难的点,网上没有找到一个比较合适的设置的方案。这个是美团技术整理一份关于网上比较多的一些线程设置方案。按照网上的方案设置线程池的大小,基本都是对线程池的大小偏高。下面是美团大佬给出的方案。Java线程池实现原理及其在美团业务中的实践这篇博客,主要在这个方案下,写一下代码方面的如果改变比较关注的核心线程、最大线程数、队列长度的调整。这里在调整整个线程池大小...原创 2020-04-25 21:25:21 · 2824 阅读 · 9 评论 -
异步获取返回值(@Async注解 和 线程池提交 callable 两种方式)
这里介绍两种 通过异步获取返回值的两种操作,这里做个小记。1、定义示范的接口public interface SycService { JsonVO testSyc(); JsonVO testSyc2();}2、定义实现的实现类@Servicepublic class SycServiceImpl implements SycService { priv...原创 2020-02-22 16:34:40 · 6930 阅读 · 0 评论 -
Semaphore 控制线程并发量
我遇到有个很消耗性能的功能,这个功能需要保证一定并发量 不能被单个请求占据太多资源。这个时候我们可以通过 Semaphore 控制线程并发量,来保证单个请求不被消耗太多资源。我们介绍一下 Semaphore 最常使用的两个api//创建可以同时容纳两个线程同时运行的并发控制器 Semaphore semaphore = new Semaphore(2); //可以将acquire 视为拦...原创 2020-01-10 23:46:09 · 368 阅读 · 0 评论 -
常用线程池及适用场景
线程池的工作队列ArrayBlockingQueue: (有界队列) 是一个数组实现的有界阻塞队列,按FIFO排序量LinkedBlockingQueue : 是一个基于链表实现的阻塞队列,按FIFO排序任务,可以设置容量,不设置使用Integer.Max_VALUE (不设置就是无界队列)newFixThreadPool,newSingleThreadExecutor使用此队列(吞吐量高...原创 2019-10-20 00:14:48 · 3425 阅读 · 0 评论 -
队列实现异步
@SpringBootApplicationpublic class DatabaseProjectApplication implements CommandLineRunner { @Autowired private List<Init> inits; public static void main(String[] args) { ...原创 2019-10-09 00:25:00 · 889 阅读 · 0 评论 -
守护线程的使用和线程类通过本类方法启动线程
一、守护线程的使用在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。注意点:(1...原创 2019-10-08 18:44:58 · 255 阅读 · 0 评论 -
CountDownLatch和okhttp3 实现多线程异步http调用
一、在工作中需要多次调用第三方接口,或者其他耗时任务,这个时候为了提高返回结果的速度,可以利用countDownLatch来实现多线程调用,提高返回结果的时间。(1) 由于代码较多,这里先将实现逻辑由伪代码,先行演示一遍。//先定义需要异步调用的次数,每次调用 CountDownLatch.countDown();//等最慢的一次完成调用,封装在list对象里面,这个时候 CountDown...原创 2019-10-02 01:10:23 · 1435 阅读 · 1 评论 -
线程池的异常处理 及 通过线程池的异常处理实现限定方法的执行时间
一、线程的捕获异常有很多种方法,比如try catch。这里将最常用的future调用get方式,去捕获异常。并用这种实现 限定方法执行固定时间,超出时间报错。(1) 先写个future get方法执行 样例 //submit任务的异常用Futrue 对象的get命令抛出异常 //(Submit执行,futrue.get()接受异常) public static void ma...原创 2019-09-20 23:57:21 · 549 阅读 · 0 评论 -
@Async通过配置线程池实现异步
在项目中有很多地方需要实现异步,@Async是一种比较简单的实现方式。1、初始化线程池@EnableAsync@Configuration@PropertySource("classpath:conf/core_thread.properties")public class TaskPoolConfig { @Value("${core.pool.size}") priv...原创 2019-09-19 21:58:31 · 1205 阅读 · 2 评论 -
SimpleDateFormat 线程不安全替代方案
一、在项目有地方需要频繁使用格式化时间,但SimpleDateFormat是线程不安全的类。如果在每次使用都创建一个对象,很浪费资源。代码也很冗余,这里将SimpleDateFormat替代方案。(1) 用ThreadLocal来放置DateFormat,使其同一个线程使用同一个SimpleDateFormat private static ThreadLocal<DateFormat&...原创 2019-09-15 20:03:15 · 2216 阅读 · 0 评论