1、SynchronousQueue

package com.blockingqueue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit; /**
* 同步队列 SynchronousQueue不存储元素,put了一个元素,必须从里边先取出来,然后再放入
*/
public class SynchronousQueueDemo {
public static void main(String[] args) {
BlockingQueue<String> blockingQueue = new SynchronousQueue<>();//同步队列 new Thread(()->{ try {
System.out.println(Thread.currentThread().getName()+"put1");
blockingQueue.put("1");
System.out.println(Thread.currentThread().getName()+"put2");
blockingQueue.put("2");
System.out.println(Thread.currentThread().getName()+"put3");
blockingQueue.put("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
},"A").start(); new Thread(()->{
try {
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+blockingQueue.take());
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+blockingQueue.take());
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+blockingQueue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
},"B").start(); }
}

2、线程池(重点)

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

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

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

线程池的好处:

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

2.1 使用单例

package com.threadpool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Demo1 {
public static void main(String[] args) {
ExecutorService threadpool = Executors.newSingleThreadExecutor();//单个线程 try {
for (int i = 0; i < 10; i++) {
//使用线程池之后,使用线程池来创建线程
threadpool.execute(()->{
System.out.println(Thread.currentThread().getName()+"ok");
}); }
} catch (Exception e) {
e.printStackTrace();
} finally {
threadpool.shutdown();
}
}
}

2.2、使用固定大小的线程

package com.threadpool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Demo1 {
public static void main(String[] args) {
// ExecutorService threadpool = Executors.newSingleThreadExecutor();//单个线程 ExecutorService threadpool = Executors.newFixedThreadPool(5);//创建一个固定大小的线程池的大小
try {
for (int i = 0; i < 10; i++) {
//使用线程池之后,使用线程池来创建线程
threadpool.execute(()->{
System.out.println(Thread.currentThread().getName()+"ok");
}); }
} catch (Exception e) {
e.printStackTrace();
} finally {
threadpool.shutdown();
}
}
}

2.3、缓存线程池

package com.threadpool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Demo1 {
public static void main(String[] args) {
// ExecutorService threadpool = Executors.newSingleThreadExecutor();//单个线程 // ExecutorService threadpool = Executors.newFixedThreadPool(5);//创建一个固定大小的线程池的大小 ExecutorService threadpool = Executors.newCachedThreadPool();//可伸缩的,遇强则强,遇弱则弱
try {
for (int i = 0; i < 10; i++) {
//使用线程池之后,使用线程池来创建线程
threadpool.execute(()->{
System.out.println(Thread.currentThread().getName()+"ok");
}); }
} catch (Exception e) {
e.printStackTrace();
} finally {
threadpool.shutdown();
}
}
}

2.4 七大参数

源码分析



本质上是ThreadPoolExecutor
源码:

    public ThreadPoolExecutor(int corePoolSize,//核心线程池大小
int maximumPoolSize,//最大核心线程池大小
long keepAliveTime,//超时了,每没有人调用就会释放
TimeUnit unit,//超时单位
BlockingQueue<Runnable> workQueue,//阻塞队列
ThreadFactory threadFactory,//线程工厂,创建线程的,一般不用动
RejectedExecutionHandler handler) {//拒绝策略
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}

四种拒绝策略

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

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

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

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

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

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

最新文章

  1. Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
  2. linux centos 安装mysql
  3. 导入excle数据将excle数据插入到数据库
  4. Mysql分区简述
  5. 项目文件包含 ToolsVersion=&quot;12.0&quot; 设置,而此版本的 MSBuild 不支持该工具版本
  6. 使用Code first 进行更新数据库结构(数据迁移)
  7. 每天一条Linux命令(OS X系统上操作)
  8. Codeforces Round #200 (Div. 2) C. Rational Resistance
  9. __import__简介
  10. 关于Ubuntu下apt的一些用法及和yum的比较
  11. centos7上修改主机名
  12. Leetcode_88_Merge Sorted Array
  13. 【Spark调优】Kryo序列化
  14. 环境部署(四):Linux下查看JDK安装路径
  15. BZOJ.4052.[Cerc2013]Magical GCD(思路)
  16. 设置div背景透明的CSS样式
  17. 模拟主库创建数据文件,dg备库空间不足时问题处理
  18. 数据库操作——SQL
  19. HTTP Header具体解释
  20. hdu1242 Rescue DFS(路径探索题)

热门文章

  1. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
  2. Hive存储格式之RCFile详解,RCFile的过去现在和未来
  3. bs4爬虫的一点心得----坑
  4. MySQL启动报:[ERROR] The server quit without updating PID file
  5. iommu分析之---DMA remap框架实现
  6. 第七十五篇:Vue兄弟组件传值
  7. 知乎问题之:.NET AOT编译后能替代C++吗?
  8. 使用spfa算法判断有没有负环
  9. Deepin20 LNMP环境搭建(又一个瞎折腾的经历)
  10. 数论进阶&amp;#160;