countdownlatch

Java学习之==> 多线程

末鹿安然 提交于 2020-01-07 14:13:20
一、创建线程的三种方式 第一种 public class App { public static void main(String[] args) { Thread thread = new Thread(() -> { while (true) { System.out.println("testThread"); } }); thread.start(); } } new Thread 创建线程 第二种 public class App { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { while (true) { System.out.println("testThread"); } } }); thread.start(); } } new Thread 创建线程 第二种和第一种本质上是同一种方法,只不过第一种方法用的是 lambda表达式的写法。 第三种 public class App extends Thread{ public static void main(String[] args) { App app = new App(); app.run(); } @Override

CountDownLatch,interrupt, wait, notify, Thread各方法

雨燕双飞 提交于 2020-01-04 02:03:12
【1】典型应用 CountDownLatch begin = new CountDownLatch(1); begin.countDown(); //锁计数减1 begin.await(); //阻塞等,直到begin为0,或当前线程被其他线程中断 http://man.ddvip.com/program/java_api_zh/java/util/concurrent/CountDownLatch.html 【2】Thread, 几个一直然不清的方法 以下为Thread的自带方法: interrupt() 中断线程. Thread.interrupt()方法,不会中断一个正在运行的线程。这一方法实际上完成的是,在线程“受到阻塞”时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。 sleep() 在指定的时间内让当前正在执行的线程休眠(暂停执行) join() 等待该线程终止 yield() 暂停当前正在执行的线程对象,并执行其他线程 http://www.gznc.edu.cn/yxsz/jjglxy/book/Java_api/java/lang/Thread

java之并发工具类计数器(CountDownLatch)

别来无恙 提交于 2020-01-01 02:41:07
java并发工具类 1、CountDownLatch : 能够使一个或多个线程等待其他线程完成各自的工作后再执行 2、CyclicBarrier : 让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。 3、Semaphore : 用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理地使用公共资源 4、Exchanger : 用于线程间协作的工具类 1、CountDownLatch(倒计时 门栓):让一些线程阻塞直到另一些线程完成一系列操作后才唤醒。 白话理解: 比如一辆拉客面包车,车里能做5个人,司机等到5个都坐上来了才可以发车。 实现:它通过调用await方法让线程进入阻塞状态等待倒计时0时唤醒。 它通过线程调用countDown方法让倒计时中的计数器减去1,当计数器为0时,会唤醒哪些因为调用了await而阻塞的线程。 底层实现: 底层是使用AQS实现的 案列:假设老板开一个紧急会议,他先到会议室等着所有人签到然后开始开会,可以使用CountDownLatch进行模拟。 public static void main(String[] args) { CountDownLatch countDownLatch=new CountDownLatch(5); for (int i=1;i<=5

① 设计模式的艺术-01.单例(Singleton)模式

…衆ロ難τιáo~ 提交于 2019-12-30 05:05:49
单例模式为何要出现   在工作过程中,发现所有可以使用单例模式的类都有一个共性,那就是这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都是一样的。   如果我们不将这个类控制成单例的结构,应用中就会存在很多一模一样的类实例,这会非常浪费系统的内存资源,而且容易导致错误甚至一定会产生错误, 所以我们单例模式所期待的目标或者说使用它的目的,是为了尽可能的节约内存空间,减少无谓的GC消耗,并且使应用可以正常运作。 常见应用场景   Windows的Task Manager(任务管理器)就是很典型的单例模式   windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。   项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。   网站的计数器,一般也是采用单例模式实现,否则难以同步。   应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。   数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。   操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。   Application 也是单例的典型应用(Servlet编程中会涉及到)

J.U.C并发工具类

你。 提交于 2019-12-30 02:50:26
目录 目标 CountDownLatch Semaphore CyclicBarrier Runnable和Callable fork/join并发处理框架 目标 并发工具类:CountDownLatch Fork/Join的使用 Futrue的使用 CountDownLatch 倒计数器。共享锁。由AQS共享锁实现。 countDown();-》倒计数器减一,并阻塞。 await();当countDown();为0时唤醒所有线程。 使用场景:希望n个线程同时执行某一操作。 基本使用 /* 没隔1s开启一个线程,共开启6个线程 若希望6个线程 同时 执行某一操作 可以用CountDownLatch实现 */ public static void test01 ( ) throws InterruptedException { CountDownLatch ctl = new CountDownLatch ( 6 ) ; for ( int i = 0 ; i < 6 ; i ++ ) { new Thread ( ) { @Override public void run ( ) { ctl . countDown ( ) ; try { ctl . await ( ) ; System . out . println ( "here I am..." ) ; } catch (

Java 异步处理简单实践

可紊 提交于 2019-12-29 15:37:01
同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异步则意味着某个处理过程可以允许多个线程同时处理。 异步通常代表着更好的性能,因为它很大程度上依赖于缓冲,是典型的使用空间换时间的做法,例如在计算机当中,高速缓存作为cpu和磁盘io之间的缓冲地带协调cpu高速计算能力和磁盘的低速读写能力。 volatile 应用场景: 检查一个应用执行关闭或中断状态。因为此关键字拒绝了虚拟对一个变量多次赋值时的优化从而保证了虚拟机一定会检查被该关键字修饰的变量的状态变化 。 CountDownLatch 应用场景: 控制在一组线程操作执行完成之前当前线程一直处于等待。例如在主线程中执行await()方法阻塞主线程,在工作线程执行完逻辑后执行countDown()方法 。 本文示例场景: 1,从控制台发送消息到消息服务器(由一个队列模拟)。 2,将消息队列写入到文件(对写文件的操作设置延时以模拟性能瓶颈)。 3,消息服务器作为控制台和文件写入之间的缓冲区。 示例代码: 注:往消息队列添加消息可以通过for循环一次性加入,本文为了便于观察文件和队列的变化而采用了控制台输入,实际写一行文件记录速度应该高于手速,所以本文示例中增加了线程sleep时间。 package org.wit.ff.ch2; import java.io.BufferedWriter; import

volatile关键字

无人久伴 提交于 2019-12-28 16:27:54
volitale关键字 简介:   volatile是Java提供的一种轻量级的同步机制。Java语言包含两种内在的同步机制:同步块(或方法)和volatile变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。 修饰的变量只能做赋值操作,不能做自增操作 1. 并发编程的3个基本概念 (1) 原子性 定义:即一个操作或者多个操作,要么全部执行并且执行过程不会被任何因素打断,要么就都不执行。 (2) 可见性 定义: 指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值 (3) 有序性 定义: 即线程执行的顺序按照代码的先后顺序执行 2. volatile关键字作用 保证内存可见性 private static volatile boolean flag = true; public static main(String[] args){ new Thread(()->{ try{ Thread.sleep(5000); } catch (InterruptedException){ e.printStackTrace(); } flag = false; })

关于Java多线程之CountDownLatch使用

混江龙づ霸主 提交于 2019-12-27 03:59:16
关于Java多线程之CountDownLatch使用 假设现在有6个学生在上晚自习,我们创建6个线程来代表6个学生,只有当6个学生都下晚自习出了教室之后,假设main线程代表班长,此时班才能锁门走人…也即是,前面6个学生线程执行完任务之后,mian线程才可执行,请看如何使用CountDownLatch实现: import java . util . concurrent . CountDownLatch ; public class CountDownLatchDemo { public static void main ( String [ ] args ) throws Exception { CountDownLatch count = new CountDownLatch ( 6 ) ; //创建6个线程,模拟6个学生 for ( int i = 1 ; i <= 6 ; i ++ ) { new Thread ( ( ) - > { System . out . println ( Thread . currentThread ( ) . getName ( ) + "\t" + "上完自习走人......" ) ; //每个线程执行完成后将初始计数减一 count . countDown ( ) ; } , String . valueOf ( i ) ) .

最常用的CountDownLatch, CyclicBarrier你知道多少? (Java工程师必会)

萝らか妹 提交于 2019-12-27 01:05:34
CountdownLatch,CyclicBarrier是非常常用并发工具类,可以说是Java工程师必会技能了。不但在项目实战中经常涉及,而且在编写压测程序,多线程demo也是必不可少,所以掌握它们的用法和实现原理非常有必要。 年年不忘,必有回响! 点赞走一走,找到女朋友~ 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作 。也就是说通过使用CountDownLatch工具类,可以让一组线程等待彼此执行完毕后在共同执行下一个操作。具体流程如下图所示,箭头表示任务,矩形表示栅栏,当三个任务都到达栅栏时,栅栏后wait的任务才开始执行。 CountDownLatch维护有个int型的状态码,每次调用countDown时状态值就会减1;调用wait方法的线程会阻塞,直到状态码为0时才会继续执行。 在多线程协同工作时,可能需要等待其他线程执行完毕之后,主线程才接着往下执行。首先我们可能会想到 使用线程的join方法 (调用join方法的线程优先执行,该线程执行完毕后才会执行其他线程),显然这是可以完成的。 使用Thread.join()方法实现 public class RunningRaceTest { public static void main(String[] args) throws

Java并发编程之CountDownLatch源码解析

百般思念 提交于 2019-12-26 16:29:21
一、导语 最近在学习并发编程原理,所以准备整理一下自己学到的知识,先写一篇CountDownLatch的源码分析,之后希望可以慢慢写完整个并发编程。 二、什么是CountDownLatch CountDownLatch是java的JUC并发包里的一个工具类,可以理解为一个倒计时器,主要是用来控制多个线程之间的通信。 比如有一个主线程A,它要等待其他4个子线程执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。 三、简单使用 public static void main(String[] args){ System.out.println("主线程和他的两个小兄弟约好去吃火锅"); System.out.println("主线程进入了饭店"); System.out.println("主线程想要开始动筷子吃饭"); //new一个计数器,初始值为2,当计数器为0时,主线程开始执行 CountDownLatch latch = new CountDownLatch(2); new Thread(){ public void run() { try { System.out.println("子线程1——小兄弟A 正在到饭店的路上"); Thread.sleep(3000); System.out.println("子线程1——小兄弟A 到饭店了"); /