jdk1.5后,提供了java.util.concurrent包,它可以实现线程池,你把线程当成普通对象就可以了,它来负责调度和执行

包括两类线程池

固定线程池

可变线程池

延迟线程池

固定线程池

public static ExecutorService newFixedThreadPool(int nThreads)     多任务

public static ExecutorService newSingleThreadPool()   单任务

ExecutorService 的方法

Excute(Runnablecommand);

shutdown();

用法如下

Mytask mt1=new Mytask("T1");//一个线程对象实例

ExecutorService  threadpool=Executors.newFixedThreadPool(2);

threadpool.excute(mt1);

可变线程池

public static ExecutorService newCachedThreadPool()

延迟线程池,实现定时任务

public static ScheduledExecutorService newScheduledThreadPool(int poolSize)

它不使用excute方法了,而是使用schedule方法

public SchedualedFuture schedule(Runnable command,long delay,TimeUnit unit);

有返回值的线程池

Callable接口配合Future接口,Future接口用来接受返回值

Callable接口作用同runnable接口,不过它是实现call接口方法,这个方法还有返回值

class myCallableImpl implements Callable

{

public Object call()

{

}

}

使用

ExecutorService threadpool =Executors.newSingleThreadExector();

Future f=threadpool.submit(new myCallableImpl();

资源封锁

前面我们知道syncnized方法可以对一段代码进行资源封锁,实际上还有很多其他方法,这里总结一下

1:synchronized

2:变量volatile

3:lock接口的实现 ReentrantLock类,它有方法:lock()、unlock(),tryLock()等,注意要try……finally,防止死锁

4:ReadWriteLock接口实现 ReentrantReadWriteLock类,方法为readLock,writeLock,使用方法大致同lock接口,不过它的效率高。也要防止死锁

5:信号量 Semaphore类,信号量不同于锁,是用来实现资源分配的,但是也有锁的特性,比如连接池,保证连接池不爆炸就可以使用这个类,主要方法为:acquire(),acquire(int n),tryAcquire(),getQueueLength(),release()

6:原子对象,在jdk15后,为了简化操作,可以把一些基本类型定义为原子对象,就单线程操作了。java.util.concurrent.atomic ,作用基本同变量volatile

7:障碍器,CyclicBarrier类,让线程同步到同一个点

队列和堆栈

java.util.Queue接口

public boolean offer(Object);  加入

public Object poll();   出

peek();  出,但是不删除

remove();同poll

element();同peek

add();同offer

常见实现为:java.util.LinkedList  和 java.util.PriorityQueue

BlockingQueue接口

java.util.concurrent.BlockingQueue

put(Object);进

take();出

BlockingDeque接口

它是一个阻塞的堆栈接口

putFirst(object o);

takeFirst();

putLast();

takeLast();

ReentrantReadWriteLock介绍

在java中提供了ReentrantReadWriteLock类 ,并可抽取读锁和写锁。读锁可以被多个读操作共享,并且会排斥所有写操作;写锁则互斥所有写操作和读操作。

使用读/写锁的必要步骤:

class RWDictionary {

private final Map

m = new TreeMap

();

//1)创建ReentrantReadWriteLock对象

private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

private final Lock r = rwl.readLock();//2) 抽取读锁

private final Lock w = rwl.writeLock();//2) 抽取写锁

public Data get(String key) {

3) 对所有读者加锁

r.lock(); try { return m.get(key); } finally { r.unlock(); }

}

public String[] allKeys() {

3 ) 对所有读者加锁

r.lock(); try { return m.keySet().toArray(); } finally { r.unlock(); }

}

public Data put(String key, Data value) {

4) 对所有写者加锁:

w.lock(); try { return m.put(key, value); } finally { w.unlock(); }

}

public void clear() {

4) 对所有写者加锁:

w.lock(); try { m.clear(); } finally { w.unlock(); }

}

}

这样可以保证   a) 写者之间以及写者和读者之间互斥

b) 同一时间只有一个写者写,多个读者可以同时读

这样读者和写者的优先级相同,当有大量的读者和极少的写者时,写进程可能很难得到执行。所以当需要写操作优先级更高时可以设置ReentrantReadWriteLock 的策略,设置为非公平策略即可

private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(false);

把构做ReentrantReadWriteLock设为false(非公平策略)(默认为true)

公平策略:当公平地构造线程时,线程利用一个近似到达顺序的策略来争夺进入。当释放写入锁定后,将写入锁定分配给等待时间最长的单个写入者,如果有一个等待时间比所有写入者更长的读取者,则将读取锁定分配给读取者

非公平策略:当非公平地构造线程时,则不需要按照到达顺序进入锁定。不管是哪一种情况,如果读取者处于活动状态,而某个写入者进入锁定状态,那么在获取写入者并释放写入锁定之前,不会将读取锁定授予任何后续的读取者。

java 资源锁_concurrent包 线程池、资源封锁和队列、ReentrantReadWriteLock介绍相关推荐

  1. Java多线程学习八:线程池常用的阻塞队列

    线程池内部结构 线程池的内部结构主要由四部分组成,如图所示. 第一部分是线程池管理器,它主要负责管理线程池的创建.销毁.添加任务等管理操作,它是整个线程池的管家. 第二部分是工作线程,也就是图中的线程 ...

  2. Java Review - 线程池资源一直不被释放案例源码分析

    文章目录 概述 问题复现 源码分析 小结 概述 在日常开发中为了便于线程的有效复用,经常会用到线程池,然而使用完线程池后如果不调用shutdown关闭线程池,则会导致线程池资源一直不被释放. 下面通过 ...

  3. 线程池异步线程中再次获取线程池资源的问题

    问题描述 在线上发生的一次问题, 在场景中有这样一个业务, 需要异步执行一个主任务, 主任务中又包含着N个子任务, 为了整个主任务能够快速处理, 又将子任务按照数量获取线程资源异步处理, 即异步线程A ...

  4. 线程池优化之充分利用线程池资源

    一.前言 最近做了电子发票的需求,分省开票接口和发票下载接口都有一定的延迟.为了完成开票后自动将发票插入用户微信卡包,目前的解决方案是利用线程池,将开票后插入卡包的任务(轮询分省发票接口,直到获取到发 ...

  5. Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现

    为什么需要线程池 我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口.但是我们创建这两种线程在运行结束后都会被 ...

  6. JAVA 多线程 JAVA 如何开发一个自定义线程池

    1.多线程设计介绍 每一个线程的启动和结束都是比较消耗时间和占用资源的. 如果在系统中用到了很多的线程,大量的启动和结束动作会导致系统的性能变卡,响应变慢. 为了解决这个问题,引入线程池这种设计思想. ...

  7. java多线程详解及线程池创建

    多线程 线程 线程是独立的执行路径 在程序执行时,即使自己没有创建线程,后台也会有多个线程 main()称为主线程,为系统的入口,用于执行整个程序 在一个进程中如果开辟了多个线程,线程的运行由调度器安 ...

  8. 码出高效:Java开发手册笔记(线程池及其源码)

    码出高效:Java开发手册笔记(线程池及其源码) 码出高效:Java开发手册笔记(线程池及其源码) 码出高效:Java开发手册笔记(线程池及其源码) 前言 一.线程池的作用 线程的生命周期 二.线程池 ...

  9. executor线程池框架_如何使用Java 5 Executor框架创建线程池

    executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...

最新文章

  1. 【NeurIPS2019】Yoshua Bengio报告:深度学习系统从1代到2代
  2. redis 亿级查询速度_亿级流量系统架构之如何保证百亿流量下的数据一致性(上)...
  3. RNN以及LSTM的介绍和公式梳理
  4. 基本算法之递推与递归的简单应用
  5. js,需要更多源字符
  6. Java\学习——字符串
  7. ul li一行两个显示
  8. python列表的存储结构_在python列表类型结构中合理地存储10亿个以上的值
  9. 三阶段提交(Three-phase commit)
  10. PHP 调用阿里云短信服务API发送短信
  11. CF1A Theatre Square
  12. 如何复制百度文库里面的文章
  13. python 城市地图_Python查询一个城市的谷歌地图的经度和纬度
  14. Sun jdk, Openjdk, Icedtea jdk关系
  15. VMware14 黑屏问题
  16. 【脑洞大开】从哲学角度看人工智能:介绍徐英瑾的《心智、语言和机器》
  17. Mac清空的废纸篓文件怎么恢复
  18. 全球及中国用于航空业的挂锁密封件行业研究及十四五规划分析报告
  19. xp无法访问2012r2域计算机列表,新安装Windows 2012域控无法没有自动创建Sysvol netlogon共享--钉子-Exchange MVP...
  20. ERP 系统的核心是什么?有什么作用?

热门文章

  1. 数仓无损压缩算法:gzip算法
  2. 对于数据,科技小白提出了灵魂三问:从哪儿来?到哪儿去?能干什么?
  3. 干了三年的Java,你竟然还不会MySQL性能优化
  4. 【华为云技术分享】基于自动机器学习的心脏病预测模型(1)
  5. 窥探日志的秘密【华为云分享】
  6. 【华为云动态】华为云携手Google,IBM,SAP等多家知名企业加入CDF,助力软件开发生态发展
  7. 基于Matlab的跨孔层析成像的最短路径法弯曲射线追踪(一)
  8. 什么叫做石英表_什么是石英表 石英表是什么意思
  9. TikZ绘图示例——尺规作图:直角的画法(二)
  10. hdu 1213 HowManyTables 并查集