
多线程
卡_卡_西
这个作者很懒,什么都没留下…
展开
-
线程(十五)---CompletableFuture、并行流(parallelStream)
写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通告私信我或者评论此博客的方式指出,以免误人子弟。多谢! 记录一下使用并行流、CompletableFuture、及普通处理方式的效率问题,创建一个taskList表示要处理的任务列表,新建task方法,sleep两秒,模拟下处理每个任务所需时间,先测试一下使用并行流,直接上代码:public class ParallelStreamAndCompletableFuture { static final List<Ob...原创 2020-08-25 11:54:38 · 1046 阅读 · 0 评论 -
线程(十四)---ThreadPoolExecutor线程池
写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通告私信我或者评论此博客的方式指出,以免误人子弟。多谢! 前面了解了Fork/Join线程池,再记录一下ThreadPoolExecutor线程池的使用,在使用前先说一下在《阿里巴巴java开发手册》中对并发处理的要求:1.线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程。2.线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这样的处理方式可以更加明确线程池的运行规则,避免资源耗尽的风险...原创 2020-08-24 18:19:18 · 263 阅读 · 0 评论 -
线程(十三)---ForkJoin
写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通告私信我或者评论此博客的方式指出,以免误人子弟。多谢! 到这里,关于 CompletableFuture 的基本使用你已经了解的差不多了,不知道你是否注意,我们前面说的带有 Sync 的方法是单独起一个线程来执行,但是我们并没有创建线程,这是怎么实现的呢?细心的朋友如果仔细看每个变种函数的第三个方法也许会发现里面都有一个 Executor 类型的参数,用于指定线程池,因为实际业务中我们是严禁手动创建线程的,如果没有指定线程池,那自然就会有一个默认.原创 2020-08-24 16:54:40 · 765 阅读 · 1 评论 -
线程(十二)---CompletableFuture(三)
写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通告私信我或者评论此博客的方式指出,以免误人子弟。多谢!示例五:异常处理接着上一篇记录一下CompletableFuture的异常处理,异常处理通常使用exceptionally、whenComplete、handle相关方法,他们之间有一点区别,exceptionally相当于try/catch,whenComplete和handle相当于try/finally。以下先演示下exceptionally的使用方式,exceptional...原创 2020-08-24 15:57:38 · 532 阅读 · 0 评论 -
线程(十一)---CompletableFuture(二)
先列一下CompletableFuture 中4个异步执行任务静态方法:public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) { return asyncSupplyStage(asyncPool, supplier);}public static <U> CompletableFuture<U> supplyAsync(Supplier...原创 2020-08-24 15:01:26 · 362 阅读 · 0 评论 -
线程(十)---CompletableFuture(一)
CompletableFuture有很多方法,为了方便归类和记住每个方法是否需要传参是否有返回值,先贴上网上找到的一张图,因为 CompletableFuture 的函数命名以及其作用都是和这几个函数式接口高度相关的。一、串行关系then 直译【然后】,也就是表示下一步,所以通常是一种串行关系体现, then 后面的单词(比如 run /apply/accept)就是上面说的函数式接口中的抽象方法名称了,它的作用和那几个函数式接口的作用是一样一样滴。如:CompletableFut...原创 2020-08-24 11:36:11 · 285 阅读 · 0 评论 -
线程(九)---Future
写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通告私信我或者评论此博客的方式指出,以免误人子弟。多谢!Future常用方法:1.get()方法可以当任务结束后返回一个结果,如果调用时,工作还没有结束,则会阻塞线程,直到任务执行完毕。2.get(long timeout,TimeUnit unit)做多等待timeout的时间就会返回结果。3.cancel(boolean mayInterruptIfRunning)方法可以用来停止一个任务,如果任务可以停止(通过mayInte...原创 2020-08-24 11:03:42 · 242 阅读 · 0 评论 -
线程(八)---Semaphore
写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通告私信我或者评论此博客的方式指出,以免误人子弟。多谢!概念:Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。从概念上讲,Semaphore是一个计数信号量,Semaphore包含一组许可证。如果有需要的话,每个acquire()方法都会阻塞,直到获取一个可用的许可证。每个release()方法都会释放持有许可证的线程,并且归还Semaphore一个可用的许可证。使用Semaphore可以..原创 2020-08-21 17:04:46 · 362 阅读 · 0 评论 -
线程(七)---CyclicBarrier
写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通告私信我或者评论此博客的方式指出,以免误人子弟。多谢!概念:CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。通过CyclicBarrier的await()方法,线程就处于barrier状态。找到一张动图很好的说明了CyclicBarrier的执行过程。常用构造方法:1.public CyclicB..原创 2020-08-21 16:00:24 · 796 阅读 · 0 评论 -
线程(六)---CountDownLatch
写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通告私信我或者评论此博客的方式指出,以免误人子弟。多谢!概念:CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。主要方法:1.public void await() thr..原创 2020-08-21 14:49:38 · 175 阅读 · 0 评论 -
线程(五)---join
写在前面:各位看到此博客的小伙伴,如有不对的地方请及时通告私信我或者评论此博客的方式指出,以免误人子弟。多谢!对于join()的概念如名字一样,当调用线程的join方法时,之后所有的操作需要等该线程结束才能继续,因此,可以很方便的使用join实现多个线程的串行执行,以下对使用join串行化执行多个线程的方式进行简单介绍,首先我创建一个线程任务类JoinTask,线程中执行的方法就是打印五次线程名字,代码如下:public class JoinTask extends Thread { ..原创 2020-08-21 14:02:47 · 184 阅读 · 0 评论 -
线程(四)---Lock
提到synchronized 不得不说一下Lock,它是从Java 5之后,在java.util.concurrent.locks包下的一个类,同synchronized一样都可以实现同步访问。两者的区别如下:ReentranLock是Lock的唯一实现类,它可以实现公平锁,默认非公平,公平锁与非公平锁区别如下:下面记录下ReentranLock的简单使用:1.首先演示ReentranLock实现同步(与synchronized一样实现同步)的例子,public class ...原创 2020-08-20 17:48:18 · 136 阅读 · 0 评论 -
线程(三)---synchronized
概念:synchronized 用来做线程同步;对象锁 与 类锁:synchronized加到非静态方法或代码块时,给对象加锁,多个线程执行该对象的同步方法会互斥多个对象执行对象中的同步方法不会互斥。synchronized加到静态方法或类时,锁的是这个类,多个线程多个对象执行对象中的同步方法时都会互斥对以上说明通过代码来演示以便方便理解。1.验证修饰非静态方法public class SynchronizedTest { public static void ..原创 2020-08-20 15:18:44 · 145 阅读 · 0 评论 -
线程(二)---wait notify的应用场景
实现生产者消费者模型1.创建生产者类public class Producer implements Runnable{ private List<Integer> container; public Producer(List<Integer> container){ this.container = container; } @Override public void run() { try原创 2020-08-20 12:21:22 · 702 阅读 · 0 评论 -
线程(一)---线程基本状态、创建线程方式、守护线程
线程的状态及转换:对 wait()、sleep()、notifyAll() 的理解:这三个方法是定义在Object类里的方法。wait(): 使持有该对象的线程把该对象的控制权(锁)交出,然后处于等待状态。notify(): 通知某个正在等待这个对象控制权的线程恢复运行。notifyAll(): 通知所有等待这个对象控制权的线程恢复运行。任何时候对象的控制权只能被一个线程拥有,在执行这三个方法时,首先应保证当前运行的线程获取了该对象的控制权,否则就会报java.lang.Ill.原创 2020-10-02 17:03:02 · 560 阅读 · 0 评论