1、SynchronousQueue

  1. package com.blockingqueue;
  2. import java.util.concurrent.BlockingQueue;
  3. import java.util.concurrent.SynchronousQueue;
  4. import java.util.concurrent.TimeUnit;
  5. /**
  6. * 同步队列 SynchronousQueue不存储元素,put了一个元素,必须从里边先取出来,然后再放入
  7. */
  8. public class SynchronousQueueDemo {
  9. public static void main(String[] args) {
  10. BlockingQueue<String> blockingQueue = new SynchronousQueue<>();//同步队列
  11. new Thread(()->{
  12. try {
  13. System.out.println(Thread.currentThread().getName()+"put1");
  14. blockingQueue.put("1");
  15. System.out.println(Thread.currentThread().getName()+"put2");
  16. blockingQueue.put("2");
  17. System.out.println(Thread.currentThread().getName()+"put3");
  18. blockingQueue.put("3");
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. },"A").start();
  23. new Thread(()->{
  24. try {
  25. TimeUnit.SECONDS.sleep(3);
  26. System.out.println(Thread.currentThread().getName()+blockingQueue.take());
  27. TimeUnit.SECONDS.sleep(3);
  28. System.out.println(Thread.currentThread().getName()+blockingQueue.take());
  29. TimeUnit.SECONDS.sleep(3);
  30. System.out.println(Thread.currentThread().getName()+blockingQueue.take());
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. },"B").start();
  35. }
  36. }

2、线程池(重点)

线程池:三大方法、7大参数、4种拒绝策略

池化技术
程序的运行、本质:占用系统的资源|优化资源的使用==》池化技术
线程池、连接池、内存池、对象池。。。创建、销毁、浪费资源

池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我

线程池的好处:

  • 1、降低资源的消耗
  • 2、提高响应的的速度
  • 3、方便管理
    线程复用、可以控制最大并发数,管理线程

2.1 使用单例

  1. package com.threadpool;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class Demo1 {
  5. public static void main(String[] args) {
  6. ExecutorService threadpool = Executors.newSingleThreadExecutor();//单个线程
  7. try {
  8. for (int i = 0; i < 10; i++) {
  9. //使用线程池之后,使用线程池来创建线程
  10. threadpool.execute(()->{
  11. System.out.println(Thread.currentThread().getName()+"ok");
  12. });
  13. }
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. } finally {
  17. threadpool.shutdown();
  18. }
  19. }
  20. }

2.2、使用固定大小的线程

  1. package com.threadpool;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class Demo1 {
  5. public static void main(String[] args) {
  6. // ExecutorService threadpool = Executors.newSingleThreadExecutor();//单个线程
  7. ExecutorService threadpool = Executors.newFixedThreadPool(5);//创建一个固定大小的线程池的大小
  8. try {
  9. for (int i = 0; i < 10; i++) {
  10. //使用线程池之后,使用线程池来创建线程
  11. threadpool.execute(()->{
  12. System.out.println(Thread.currentThread().getName()+"ok");
  13. });
  14. }
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. } finally {
  18. threadpool.shutdown();
  19. }
  20. }
  21. }

2.3、缓存线程池

  1. package com.threadpool;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class Demo1 {
  5. public static void main(String[] args) {
  6. // ExecutorService threadpool = Executors.newSingleThreadExecutor();//单个线程
  7. // ExecutorService threadpool = Executors.newFixedThreadPool(5);//创建一个固定大小的线程池的大小
  8. ExecutorService threadpool = Executors.newCachedThreadPool();//可伸缩的,遇强则强,遇弱则弱
  9. try {
  10. for (int i = 0; i < 10; i++) {
  11. //使用线程池之后,使用线程池来创建线程
  12. threadpool.execute(()->{
  13. System.out.println(Thread.currentThread().getName()+"ok");
  14. });
  15. }
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. } finally {
  19. threadpool.shutdown();
  20. }
  21. }
  22. }

2.4 七大参数

源码分析



本质上是ThreadPoolExecutor
源码:

  1. public ThreadPoolExecutor(int corePoolSize,//核心线程池大小
  2. int maximumPoolSize,//最大核心线程池大小
  3. long keepAliveTime,//超时了,每没有人调用就会释放
  4. TimeUnit unit,//超时单位
  5. BlockingQueue<Runnable> workQueue,//阻塞队列
  6. ThreadFactory threadFactory,//线程工厂,创建线程的,一般不用动
  7. RejectedExecutionHandler handler) {//拒绝策略
  8. if (corePoolSize < 0 ||
  9. maximumPoolSize <= 0 ||
  10. maximumPoolSize < corePoolSize ||
  11. keepAliveTime < 0)
  12. throw new IllegalArgumentException();
  13. if (workQueue == null || threadFactory == null || handler == null)
  14. throw new NullPointerException();
  15. this.corePoolSize = corePoolSize;
  16. this.maximumPoolSize = maximumPoolSize;
  17. this.workQueue = workQueue;
  18. this.keepAliveTime = unit.toNanos(keepAliveTime);
  19. this.threadFactory = threadFactory;
  20. this.handler = handler;
  21. }

四种拒绝策略

1、ThreadPoolExecutor.AbortPolicy()
银行满了,还有人进来,不处理这个人的,抛出异常

2、ThreadPoolExecutor.CallerRunsPolicy()
银行满了,还有人进来,哪来的去哪里

3、ThreadPoolExecutor.DiscardPolicy()
队列满了、不会抛出异常

4、ThreadPoolExecutor.DiscardOldestPolicy()
队列满了、尝试去和最早的竞争,也不会抛出异常

1、cpu密集型,几核,就是几,可以保证CPU的效率最高!!!Runtime.getRuntime().availableProcessors()

2、IO密集型 判断你程序中十分耗IO的线程
程序 15个大型任务,io十分占用资源

JUI(6)线程池的更多相关文章

  1. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  2. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  3. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  4. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  5. NGINX引入线程池 性能提升9倍

    1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...

  6. Java线程池解析

    Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...

  7. Android线程管理之ExecutorService线程池

    前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...

  8. Android线程管理之ThreadPoolExecutor自定义线程池

    前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...

  9. -Android -线程池 批量上传图片 -附php接收代码

    (出处:http://www.cnblogs.com/linguanh/) 目录: 1,前序 2,类特点 3,用法 4,java代码 5,php代码 1,前序 还是源于重构,看着之前为赶时间写着的碎片 ...

随机推荐

  1. JUC源码学习笔记4——原子类,CAS,Volatile内存屏障,缓存伪共享与UnSafe相关方法

    JUC源码学习笔记4--原子类,CAS,Volatile内存屏障,缓存伪共享与UnSafe相关方法 volatile的原理和内存屏障参考<Java并发编程的艺术> 原子类源码基于JDK8 ...

  2. 让Python更优雅更易读(第一集)

    变量和注释 1.变量 在编写变量尽量要让其清晰只给,让人清除搞清楚代码的意图 下方两段代码作用完全一样,但第二段代码是不是更容易让人理解 value = s.strip() username = in ...

  3. Luogu3379 【模板】最近公共祖先(LCA) (倍增LCA)

    蒟蒻又来复习模板了.还WA了两次 #include <iostream> #include <cstdio> #include <cstring> #include ...

  4. 自定义注解,利用AOP实现日志保存(数据库),代码全贴,复制就能用

    前言 1,在一些特定的场景我们往往需要看一下接口的入参,特别是跨系统的接口调用(下发,推送),这个时候的接口入参就很重要,我们保存入参入库,如果出问题就可以马上定位是上游还是下游的问题(方便扯皮) 2 ...

  5. [CSP-S 2019 day2 T2] 划分

    题面 题解 CSP赛场上能请教别人吗 在这道题中,我看到了一个很敏感又很熟悉的东西--平方! 这意味着,可以推出一些结论,使这道题几乎可以边输入边解决. 自己在脑子里动态一下就知道,像这种总和一定.代 ...

  6. 057_末晨曦Vue技术_处理边界情况之强制更新和创建低开销的静态组件

    强制更新和创建低开销的静态组件 点击打开视频讲解更加详细 强制更新 如果你发现你自己需要在 Vue 中做一次强制更新,99.9% 的情况,是你在某个地方做错了事. 你可能还没有留意到数组或对象的变更检 ...

  7. 安装配置华为Fusion access(Windows AD)桌面云并对接Fusion Compute与Windows_server_2012

    安装Fusion access虚拟机 根据自己情况自定义 点击编辑虚拟机设置 添加镜像 点击确定并开启此虚拟机 选择第二个 Install 添加Network:修改hostname:修改密码 回车添加 ...

  8. 如何使用Postman调试HMS Core推送接口?

    HMS Core推送服务支持开发者使用HTTPS协议接入Push服务端.Postman是一款接口测试工具,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果.Postma ...

  9. 大家都能看得懂的源码之 ahooks useVirtualList 封装虚拟滚动列表

    本文是深入浅出 ahooks 源码系列文章的第十八篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 简介 提供虚拟化列表能力的 Hook,用于解决展示海量数据渲染时 ...

  10. ORM增删改查并发性能测试2

    前言 上一篇<ORM增删改查并发性能测试>出现了点小失误,有的输出SQL日志的代码没有禁用,数据库连接字符串可能有问题.统一环境,统一代码后,重新写一篇. 这次重点是并发性能测试,真不是为 ...