
多线程
Kincym
这个作者很懒,什么都没留下…
展开
-
多线程之读写锁ReentrantReadWriteLock
读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁! ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁 线程进入读锁的前提条件:原创 2017-10-11 16:08:58 · 388 阅读 · 0 评论 -
多线程之Condition
简介上面我们说了Lock,那是对synchronized的一种更为面向对象的替代,在原来的synchronized内部,我们可以调用object的wait与notify方法,那么使用lock之后,如何进行线程的通信呢?condition一方面是对lock功能的补充(也就是说,你用了lock,为了保证线程的通信,就得用condition)。Condition实现多生产多消费模式package com.原创 2017-10-12 11:13:26 · 528 阅读 · 0 评论 -
多线程之Executors工厂类创建线程
newCachedThreadPool()使用Executors创建的newCachedThreadPool() 是一个无界线程,可以进行线程自动回收,所谓无界是指池中存放个数是Integer.MAX_VALUE个。用来创建一个可缓存线程池,该线程池没有长度限制,对于新的任务,如果有空闲的线程,则使用空闲的线程执行,如果没有,则新建一个线程来执行任务。如果线程池长度超过处理需要,可灵活回收空闲线程。原创 2017-10-21 21:04:06 · 552 阅读 · 0 评论 -
多线程之CompletableFuture(中)
thenAcceptAsyncConsumer 接收上个阶段的返回值T,return Void;返回CompletableFuture<Void>thenAccept 该方法是同步的public static void main(String[] args) { CompletableFuture<Void> stringCompletableFuture = Completa原创 2017-11-07 14:43:11 · 1474 阅读 · 0 评论 -
多线程之CompletableFuture(下)
thenAcceptBothAsyncthenAcceptBothAsync(CompletionStage<? extends U> other, BiConsumer<? super T, ? super U> action)同时执行两个线程,获取两个返回结果T,U作为参数,进入BiConsumer<T, U>,retrun Void,返回 CompletableFuture<原创 2017-11-07 16:27:48 · 517 阅读 · 0 评论 -
多线程之StampedLock
简介它是java8在java.util.concurrent.locks新增的一个API。ReentrantReadWriteLock 在沒有任何读写锁时,才可以取得写入锁,这可用于实现了悲观读取(Pessimistic Reading),即如果执行中进行读取时,经常可能有另一执行要写入的需求,为了保持同步,ReentrantReadWriteLock 的读取锁定就可派上用场。然而,如果读取执行情况原创 2017-10-13 14:07:40 · 324 阅读 · 0 评论 -
多线程之ForkJoin框架
Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。工作窃取算法工作窃取算法:通过此算法降低线程等待和竞争。工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。那么为什么需要使用工作窃取算法呢? 假如我们需要做一个比较大的任务,我们可以把这个任务分割为若干互不依赖的子任原创 2017-10-13 14:51:06 · 462 阅读 · 0 评论 -
多线程之四大拒绝策略
定义拒绝策略,需要重写RejectedExecutionHandler接口的rejectedExecution(Runnable r, ThreadPoolExecutor executor);方法。public interface RejectedExecutionHandler { void rejectedExecution(Runnable r, ThreadPoolExecut原创 2017-10-23 15:00:34 · 3679 阅读 · 3 评论 -
多线程之CompletableFuture(上)
CompletableFuture类实现了CompletionStage和Future接口。Future是Java 5添加的类,用来描述一个异步计算的结果,但是获取一个结果时方法较少,要么通过轮询isDone,确认完成后,调用get()获取值,要么调用get()设置一个超时时间。但是这个get()方法会阻塞住调用线程,这种阻塞的方式显然和我们的异步编程的初衷相违背,为了解决这个问题,JDK吸收了gu原创 2017-10-31 15:46:31 · 1807 阅读 · 1 评论 -
多线程之多线程ThreadPoolExecutor
简介线程是一个程序员一定会涉及到的一个概念,但是线程的创建和切换都是代价比较大的。所以,我们有没有一个好的方案能做到线程的复用呢?这就涉及到一个概念——线程池。合理的使用线程池能够带来3个很明显的好处: 1.降低资源消耗:通过重用已经创建的线程来降低线程创建和销毁的消耗 2.提高响应速度:任务到达时不需要等待线程创建就可以立即执行。 3.提高线程的可管理性:线程池可以统一管理原创 2017-10-20 18:00:24 · 509 阅读 · 0 评论 -
多线程之重入锁ReentrantLock
* void lock(). //获取锁,一直等待,直到拿到锁,不可被打断 * void lockInterruptibly() throws InterruptedException. //获取锁,可被打断 * boolean tryLock(). //尝试拿锁,拿到返回ture,拿不到返回false * boolean tryLock(long timeout, TimeUnit uni原创 2017-10-11 15:38:27 · 428 阅读 · 0 评论 -
多线程之Semaphore
简介Semaphore有两个构造方法 Semaphore(int)、Semaphore(int,boolean),参数中的int表示该信号量拥有的许可数量,boolean表示获取许可的时候是否是公平的,如果是公平的那么,当有多个线程要获取许可时,会按照线程来的先后顺序分配许可,否则,线程获得许可的顺序是不定的。这里在jdk中讲到 “一般而言,非公平时候的吞吐量要高于公平锁”,这是为什么呢?非公平锁原创 2017-10-10 22:45:37 · 336 阅读 · 0 评论 -
多线程之execute,submit
executeexecute() 是在Executor接口中定义的,ThreadPoolExecutor继承了AbstractExecutorService抽象类,该抽象类实现了ExecutorService接口(但并没有覆盖execute方法),而ExecutorService接口继承了Executor接口。简而言之就是说ThreadPoolExecutor实现了execute()方法。await原创 2017-10-27 11:47:47 · 1634 阅读 · 0 评论 -
多线程系列基础(一)
多线程继基础原创 2017-03-27 00:37:46 · 599 阅读 · 1 评论 -
多线程之Thread和Runable选择及原理(二)
模拟排队等号例子Thread:public class TicketWindows extends Thread{ private final String name; private final int MAX = 6; private int index = 1; public TicketWindows(String name) { this.na原创 2017-09-05 15:02:18 · 446 阅读 · 0 评论 -
多线程之join,interrupt(三)
join/** * join 阻塞进程直到线程执行完毕 * join():如下面的例子,当t和t1全都执行完,才执行下面的for循环 * t和t1相互不受影响。 * join(long millis):经过millis毫秒后,就算t,t1没有执行完,也执行下面代码。 * join(long millis, int nanos):同上。 */public class Threa原创 2017-09-08 11:15:00 · 535 阅读 · 0 评论 -
多线程之结束线程生命周期(四)
通过标识关闭线程通过设置一个标识ture,false。/** * 通过标识关闭线程 */public class ThreadEnd1 { volatile static boolean flag = true; public static void main(String[] args) throws InterruptedException { Thread原创 2017-09-08 15:44:18 · 401 阅读 · 0 评论 -
多线程之捕获异常(五)
捕获异常/** * 线程中发生异常,如果内部没有捕获,外部是无法捕获的 * 因为线程中没有抛出异常 * */public class ThreadException { public static void main(String[] args) { try { Thread t= new Thread("TTTT"){原创 2017-09-10 16:55:13 · 676 阅读 · 0 评论 -
多线程之Phaser
简介Phaser由java7中推出,是java7中新增的一个使用同步工具,在功能上面它与CyclicBarrier、CountDownLatch有些重叠,但是它提供了更加灵活、强大的用法。CyclicBarrier,允许一组线程互相等待,直到到达某个公共屏障点。它提供的await()可以实现让所有参与者在临界点到来之前一直处于等待状态。CountDownLatch,在完成一组正在其他线程中执行的操作原创 2017-10-17 17:09:07 · 674 阅读 · 0 评论 -
多线程之CountDownLatch
概念CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。 构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。与Coun原创 2017-10-09 13:38:59 · 922 阅读 · 0 评论 -
多线程之CyclicBarrier
简介CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉Cycl原创 2017-10-09 16:01:31 · 577 阅读 · 0 评论 -
多线程之Exchanger
简介Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据。在本文中我将采取由浅入深的方式来介绍分析这个工具类。首先我们来看看官方的api文档中的叙述: A synchronization point at which threads can pair and swap elements within pairs. Each thread presents som原创 2017-10-09 21:38:23 · 451 阅读 · 0 评论 -
多线程之invokeAny,invokeAll介绍
方法invokeAny,invokeAll具有阻塞性。invokeAny取得第一个方法的返回值,当第一个任务结束后,会调用interrupt方法中断其它任务。invokeAll等线程任务执行完毕后,取得全部任务的结果值。invokeAnyinvokeAny(Collection<? extends Callable<T>> tasks):public class InvokeAnyTest {原创 2017-10-25 14:26:28 · 7066 阅读 · 2 评论