java.util.concurrent.atomic

一个小型工具包,支持单个变量上的无锁线程安全编程.
包含的类:

这些类的相关操作都是原子性的

java.util.concurrent

  1. 线程池

    //线程池的创建
    //创建一个线程池,该线程池重用固定数量的从共享无界队列中运行的线程。
    //在任何时候,最多nThreads个线程同时处理任务。
    //如果所有线程处于活动状态时又提交其他任务,则它们将在等待队列中直到有一个线程空闲可用。
    //如果任何线程由于在关闭之前的执行期间发生故障而终止,如果需要执行后续任务,则新线程将占用它。
    //池中的线程将一直存在,直到调用shutdown方法 。
    //public static ExecutorService newFixedThreadPool(int nThreads)
    ExecutorService es = Executors.newFixedThreadPool(3);//向线程池中添加任务
    es.execute(new Runnable(){});//可以添加多个任务
    //但是最多有三个线程去执行这些任务,即最多只有三个任务同时执行//线程池的关闭
    es.shutdown();//所有任务执行完后关闭
    es.shutdownNow(); //立即关闭,不管任务有没有执行完//创建缓存的线程池
    //创建一个根据需要创建新线程的线程池,但在可用时将重新使用以前构造的线程。
    //这些池通常会提高执行许多短暂异步任务的程序的性能。
    //调用execute将重用以前构造的线程(如果可用)。
    //如果没有可用的线程,将创建一个新的线程并将其添加到该池中。
    //未使达六十秒的线程将被终止并从缓存中删除。
    //因此,长时间保持闲置的池将不会消耗任何资源
    public static ExecutorService newCachedThreadPool()//创建只有单个线程的线程池public static ExecutorService newSingleThreadExecutor() //如何实现线程死掉后重新启动,通过单一线程池,这样这个线程死掉后,线程池会自动重新创建一个线程来替代//调度线程池
    ScheduledExecutorService se = Executors.newScheduledThreadPool(3);
    se.schedule(new Runnable() //3秒后执行
    {   @Overridepublic void run(){System.out.println("bombing");}
    }, 3, TimeUnit.SECONDS);se.scheduleAtFixedRate(new Runnable()//6秒后第一次执行,以后每隔两秒执行一次
    {@Overridepublic void run(){System.out.println("bombing");}
    }, 6, 2, TimeUnit.SECONDS);se.scheduleWithFixedDelay(new Runnable()
    {@Overridepublic void run(){System.out.println("bombing");}
    }, 3, 2, TimeUnit.SECONDS);
    

    Callable 与 Future 类似 dot net 的async与await

    使用Callable来执行任务,Future获取结果,在使用到结果的时候如果Callable还没结束,程序会暂停并等待结果,就跟await一样

    public class CallableAndFuture
    {
    /*** @param args*/
    public static void main(String[] args)
    {ExecutorService es = Executors.newSingleThreadExecutor();Future<String> future = es.submit(new Callable<String>(){@Overridepublic String call() throws Exception{Thread.sleep(2000);return "Hello";}});System.out.println("等待结果");try{System.out.println("返回结果:"+future.get());}catch (InterruptedException e){e.printStackTrace();}catch (ExecutionException e){e.printStackTrace();}es.shutdown();ExecutorService es1 = Executors.newFixedThreadPool(10);CompletionService<Integer> completionService = new ExecutorCompletionService<>(es1);for(int i=1;i<=10;i++){final int sequence=i;completionService.submit(new Callable<Integer>(){@Overridepublic Integer call() throws Exception{Thread.sleep(new Random().nextInt(5000));return sequence;}});}for(int i=0;i<10;i++){try{System.out.println(completionService.take().get());}catch (InterruptedException | ExecutionException e){e.printStackTrace();}}es1.shutdown();
    }
    }

    java.util.concurrent.locks

    主要的类与接口

//Lock接口
void lock() //获得锁。
void lockInterruptibly() //获取锁定,除非当前线程是 interrupted 。
Condition newCondition() //返回一个新Condition绑定到该实例Lock实例。
boolean tryLock() //只有在调用时才可以获得锁。
boolean tryLock(long time, TimeUnit unit) //如果在给定的等待时间内是空闲的,并且当前的线程尚未得到 interrupted,则获取该锁。
void unlock() //释放锁。
//使用规范
//当在不同范围内发生锁定和解锁时,
//必须注意确保在锁定时执行的所有代码由try-finally或try-catch保护,以确保在必要时释放锁定。
Lock l = ...; l.lock(); try { } finally { l.unlock(); }
//ReentrantLock
static class Outputer
{Lock lock = new ReentrantLock();public void output(String name){lock.lock();try{int len=name.length();for(int i=0;i<len;i++){System.out.print(name.charAt(i));}System.out.println();}finally{// TODO: handle finally clauselock.unlock();}}} //基于读写锁的缓存
public class CacheDemo
{private Map<String, Object> cache = new HashMap<>();private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();public static void main(String[] args){}//这种思路不能很好的处理获取数据//因为所有的获取数据都是互斥的,效率低public synchronized Object getData1(String key){Object value = cache.get(key);if(value==null){value=new Random().nextInt(100);cache.put(key, value);}return value;}//锁降级:从写锁变成读锁;//锁升级:从读锁变成写锁。//读锁是可以被多线程共享的,写锁是单线程独占的。//也就是说写锁的并发限制比读锁高。/*** 这种方法使用读写锁来处理缓存,同时读的时候不互斥,*当有一个去修改的时候,转换为写锁* @param key* @return value*/public Object getData2(String key){rwl.readLock().lock();Object value = null;try{value=cache.get(key);if(value==null)//缓存中没有数据,去获取{rwl.readLock().unlock();//释放读锁rwl.writeLock().lock(); //加写锁try{value=cache.get(key);//为了防止多次写入if(value==null)//为了防止多次写入{value=new Random().nextInt(100);cache.put(key, value);}rwl.readLock().lock();}finally{// TODO: handle finally clauserwl.writeLock().unlock();}}}finally {rwl.readLock().unlock();}return value;}
}/*关于读写锁升级和降级的限制1.因为同一个线程中,在没有释放读锁的情况下,就去申请写锁,这属于锁升级,ReentrantReadWriteLock是不支持的。2.从写锁降级成读锁,并不会自动释放当前线程获取的写锁,仍然需要显示的释放,否则别的线程永远也获取不到写锁。
*/

Condition 线程通信

    //利用condition进行线程间的通信static class Business{private ReentrantLock lock = new ReentrantLock();private Condition condition1 = lock.newCondition();private Condition condition2 = lock.newCondition();private Condition condition3 = lock.newCondition();private int flag=1;public void sub(int i){lock.lock();try{while(flag!=1){try{//this.wait();condition1.await();}catch (InterruptedException e){e.printStackTrace();}}for (int j = 1; j <= 10; j++){System.out.println("sub thread sequence of " + j+",loop of "+i);}flag=2;condition2.signal();}finally{// TODO: handle finally clauselock.unlock();}}public void sub2(int i){lock.lock();try{while(flag!=2){try{//this.wait();condition2.await();}catch (InterruptedException e){e.printStackTrace();}}for (int j = 1; j <= 20; j++){System.out.println("sub2 thread sequence of " + j+",loop of "+i);}flag=3;condition3.signal();}finally{// TODO: handle finally clauselock.unlock();}}public void main(int i){lock.lock();try{while(flag!=3){try{//this.wait();condition3.await();}catch (InterruptedException e){e.printStackTrace();}}for (int j = 1; j <= 100; j++){System.out.println("main thread sequence of " + j+",loop of "+i);}flag=1;//this.notify();condition1.signal();}finally{// TODO: handle finally clauselock.unlock();}}}

转载于:https://www.cnblogs.com/phasd/p/9245019.html

Java5的 线程并发库相关推荐

  1. Java多线程与线程并发库高级应用笔记

    以下内容是学习张老师Java多线程与线程并发库高级应用时所做的笔记,很有用 网络编辑器直接复制Word文档排版有点乱,提供原始文件下载 先看源文件概貌 张孝祥_Java多线程与并发库高级应用 [视频介 ...

  2. Java5线程并发库之LOCK(锁)CONDITION(条件)实现线程同步通信

    为什么80%的码农都做不了架构师?>>>    Lock(锁)&Condition(条件)实现线程同步通信 接下来介绍,java5线程并发库里面的锁.跟锁有关的类和接口主要是 ...

  3. 线程并发库和线程池的作用_线程和并发介绍

    线程并发库和线程池的作用 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如 ...

  4. 线程并发库和线程池的作用_并发–顺序线程和原始线程

    线程并发库和线程池的作用 不久前,我参与了一个项目,该项目的报告流程如下: 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新 ...

  5. 使用Java线程并发库实现两个线程交替打印的线程题

    背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交 ...

  6. java基础巩固笔记(5)-多线程之线程并发库

    2019独角兽企业重金招聘Python工程师标准>>> java基础巩固笔记(5)-多线程之线程并发库 标签: java [TOC] 本文主要概述java.util.concurre ...

  7. Java5线程并发库之保障变量的原子性操作

    为什么80%的码农都做不了架构师?>>>    java.util.concurrent.atomic 首先我们看java.util.concurrent.atomic包,它主要是提 ...

  8. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

  9. Java使用线程并发库模拟弹夹装弹以及发射子弹的过程

    同样是从网上看到的一个需求,需求描述都在代码中. 不多说了,直接贴代码了.相信大家都能够看得懂的! package cn.yw.bore;import java.util.ArrayList; imp ...

最新文章

  1. tensorflow中的placeholder()
  2. python编程*三角形图形创意图片_python循环输出三角形图案的例子
  3. [深度学习] 自然语言处理---Transformer实现(二)
  4. sjf调度算法_如何通过静态方法预测SJF调度中未来过程的突发时间?
  5. 信息学奥赛一本通 2035:【例5.2】平移数据
  6. WS-*协议栈及相关概念
  7. 提高加密程序加密强度的技巧
  8. 《数据结构 严蔚敏C》期末高频考题整理(含详解)
  9. 叉车式AGV 时间窗问题
  10. Java 坐标系相互转换
  11. mysql聚簇索引abc_索引优化_MySQL开发教程_IT技术个人博客
  12. java 游戏打砖块_基于JAVA的打砖块游戏
  13. 个人怎么创建微信公众号?
  14. Mac OS X 系统目录结构
  15. 4 HQL操作之 -- DDL命令
  16. Sunshine数据库篇之查询
  17. html description字数限制,description标签如何正确使用?
  18. 铨顺宏RFID:射频技术应用在服装资产管理上有什么作用
  19. 【改进和增强Microsoft Office应用程序】ExtendOffice软件产品介绍
  20. playwright 使用本地chrome 浏览器 加载多个extension 插件

热门文章

  1. fin.is_open()与fin.open()有什么区别?
  2. linux内核关于io的变迁
  3. JAVA字符串前补零和后补零的快速方法
  4. 史上最全面的Neo4j使用指南
  5. Cookie简单使用方法
  6. .net erp(办公oa)开发平台架构概要说明之表单设计器
  7. HTML5 Web 客户端五种离线存储方式汇总
  8. Shiro 那点事儿
  9. Android APK反编译得到Java源代码或资源文件
  10. 在Linux下用gdb检测内核rootkit