分类 java 中的文章

CountDownLatch和CyclicBarrier以及join()

CountDownLatch、CyclicBarrier、join() 一、CountDownLatch(倒计时器): 功能:同步辅助类,也可以理解为倒计时锁,用于同步线程状态,允许一个或多个线程,等待其他一组线程完成操作,再继续往下执行。(会阻塞主线程) 特点:不可复用! 重要方法: countDown()方法:计数器-1,每次线程执行完后调用; await()方法:等待方法,在需要阻塞的地方调用,当所有线程都执行完后,自动往下执行 用法:构造的时候指定一个计数器的值,每个线程执行完后就减1,直到为0再往下走。 DEMO:四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的。 二、CyclicBarrier(循环栅栏): 功能:同步辅助类,功能和CountDownLatch类似,用于同步线程状态,允许一组线程相互之间等待,达到一个共同点,再继续执行。(不会阻塞主线程) 特点:可复用!当组内所有线程都到达某个执行点后,count参数会被重置,于是就可重用了。 重要方法: await()方法:当某个线程到达某个点(比如执行完某个任务)后调用该方法,就会等待其他线程,直到所有线程都到达这个点,再自动往下执行。 还有个重载方法await(long timeOut,TimeUnit unit),用- 于当某个线程执行超过指定时间后还未到达某个点时,就会抛出异常,不再等待这个线程,并往下执行。 用法:构造的时候指定一个线程数量的值和到达某个点后执行的动作。 DEMO:三个运动员各自准备,等到三个人都准备好后,再一起跑 三、join()方法 join方法也是管理线程状态同步的一个方法,和CountDownLatch和CyclicBarrier均由自身调用不同的是,join的调用者为当前线程,后面的线程必须等调用join的线程执行完后才能执行。 参考:https://www.cnblogs.com/be-thinking/p/9292290.html 参考:https://blog.csdn.net/qq_39241239/article/details/87030142……

阅读全文

Synchronized和Lock

Synchronized关键字 1.作用 保证同一时刻最多只有1个线程执行 被Synchronized修饰的方法 / 代码 其他线程 必须等待当前线程执行完该方法 / 代码块后才能执行该方法 / 代码块 2.修饰 2.1修饰方法 //对象锁 //写法1 public synchronized void method() { // todo } //写法2,写法2其实是同步代码块的写法,但在这里也是相当于修饰了方法 public void method() { synchronized(this) { // todo } } 2.2修饰静态方法 //类锁 public synchronized static void method() { // todo } 2.3修饰类 //类锁 class ClassName { public void method() { synchronized(ClassName.class) { // todo } } } 2.4修饰代码块 //对象锁 //写法一 synchronized(this) { //todo } ' //写法二 Object obj =new Object(); synchronized(obj) { //todo } 2.……

阅读全文

Future、FutureTask、CompletableFuture

Future、FutureTask、CompletableFuture Future Feature接口 public interface Future<V> { /** * 取消任务的执行 * 如果任务已经完成,或者已经被取消,或者因为其他原因不能被取消,则返回失败 * 如果任务在调用时还未启动,那么返回成功 * 如果任务已经在执行过程中,则根据参数确定此执行任务的线程能否被中断,来试图停止任务的执行 * @param mayInterruptIfRunning * @return */ boolean cancel(boolean mayInterruptIfRunning); /** * 判断任务是否已经取消,任务正常完成前将其取消,则返回true * @return */ boolean isCancelled(); /** * 判断任务是否已经完成,需要注意的是如果任务正常、异常或取消,都返回true * @return */ boolean isDone(); /** * 等待任务执行结束,并返回结果 * @return * @throws InterruptedException 线程被中断异常 * @throws ExecutionException 任务执行异常 */ V get() throws InterruptedException, ExecutionException; /** * 等待任务执行结束,并返回结果,同上面get方法的区别是设置了超时时间, * @param timeout * @param unit * @return * @throws InterruptedException * @throws ExecutionException * @throws TimeoutException */ V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; } FutureTask介绍 Future只是一个接口,无法直接创建对象,因此有了FutureTask。RunnableFuture继承了Runnable和Future接口,而FutureTask实现了RunnableFuture接口。 Future是一个接口, FutureTask类是Future 的一个实现类,并实现了Runnable,因此FutureTask可以传递到线程对象Thread中新建一个线程执行。 FutureTask实现了RunnableFuture接口,而RunnableFuture继承了Runnable和Future,也就是说FutureTask既是Runnable,也是Future。……

阅读全文

Thread、Runnable、Callable、线程池

1.创建线程的三种方式 (1)继承thread,重写run方法 (2)实现Runnable接口,实现run方法 (3)实现Callable接口,实现call方法 (4)线程池 2.Runnable和Callable的区别: (1)Callable实现的方法是call(),Runnable实现的方法是run(). (2)Callable的任务执行后可返回值,可以拿到一个Future对象,而Runnable的任务没有返回值 (3)call方法需要抛出异常InterruptedException和ExecutionExecption,run方法只能在内部消化InterruptedException 3.Thread的缺点: Java是单继承多实现,不利于扩展. 4. 线程池 4.1 为什么要使用线程池 降低资源消耗。 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 4.2 execute()和submit()的区别 (1)可接受任务类型: submit: submit(Callable<T> task):Future<T> -ExecutorService submit(Runnable task):Future<?> -ExecutorService submit(Runnable task,T result):Future<T> -ExecutorService execute: execute(Runnable command):void -Executor 从源码种可以看出 execute只能接受Runnable类型的任务 submit不管是Runnable还是Callable类型的任务都可以接受 (2)返回值 由Callable和Runnable的区别可以看出: execute没有返回值 submit有返回值,所以需要返回值的时候必须使用submit (3)异常处理 submit在执行过程中与execute不一样,不会抛出异常而是把异常保存在成员变量中,在FutureTask.get阻塞获取的时候再把异常抛出来。 execute中抛出异常 execute中的是Runnable接口的实现,所以只能使用try、catch来捕获CheckedException,通过实现UncaughtExceptionHande接口处理UncheckedException 即和普通线程的处理方式完全一致……

阅读全文

异常

异常和错误的区别:异常能被程序本身处理,错误是无法处理。 异常层次结构图 ……

阅读全文

责任链模式使用

责任链模式的重点在“链上”,由一条链去处理相似的请求,在链中决定谁来处理这个请求,并返回相应的结果。 角色: 抽象处理者(Handler)角色:该角色对请求进行抽象,并定义一个方法来设定和返回对下一个处理者的引用。 具体处理者(Concrete Handler):该角色接到请求后,可以选择将请求处理掉,或者将请求传给下一个处理者。由于具体处理者持有对下一个处理者的引用,因此,如果需要,处理者可以访问下一个处理者。 优点 责任链模式将请求和处理分开,请求者不知道是谁处理的,处理者可以不用知道请求的全貌。 提高系统的灵活性。 缺点 降低程序的性能。每个请求都是从链头遍历到链尾,当链比较长的时候,性能会大幅下降。 不易于调试。由于该模式采用了类似递归的方式,调试的时候逻辑比较复杂。 ……

阅读全文