java并发编程实战-基础构建模块3

来源:互联网 发布:java项目开发流程图 编辑:程序博客网 时间:2024/06/05 02:57

1,阻塞方法与中断方法
  1.1,线程可能会阻塞或暂停执行,如:等待IO操作、等待锁、等待从Thread.sleep方法中醒来
  1.2,当线程阻塞时,它通常被挂起,并处于某种阻塞状态(BLOCKED,WAITING,TIMED_WAITING)
  1.3,阻塞必须等待某个不受控制的事件发生后才能继续执行,被置回RUNNABLE状态
  1.4,某个方法抛出InterruptedException时,表示该方法是一个阻塞方法,如果这个方法被中断,那么它将努力提前结束阻塞状态
  1.5,中断是一种协作机制,一个线程不能强制其他线程停止正在执行的操作而去执行其他的操作,当线程A中断B时,A仅仅是要求B在执行到某个可以暂停的地方停止正在执行的操作
  1.6,当在代码中调用一个将抛出InterruptException异常方式,表示自己的方法也就变成一个阻塞方法了,并且必须处理对应的中断的响应。
  1.7,对中断的响应主要有两种选择:传递和恢复中断
    1.7.1,传递:避开异常,向上级抛出
    1.7.2,恢复中断:捕获InterruptException异常并调用当前线程的Interrupt方法恢复中断状态,这样在调用栈中更高层的代码将看到一个中断

2,阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore)、栅栏(Barrier)以及闭锁(Latch)。

  2.1,所有的同步工具类都包含了一些特定的结构化属性:他们封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待,此外还提供了一些方法对状态进行操作,以及另外一些方法用于高效地等待同步工具类进入到预期状态
3,闭锁
  3.1,闭锁是一种同步工具类,可以延迟线程的进度直到其达到终止状态
  3.2,CountDownLatch是一种灵活的闭锁实现,它可以使一个或多个线程等待一组事件发生,闭锁状态包括一个计数器,该计数器被初始化为一个正数,表示需要等待的事件数量,countDown方法递减计数器,该计数器表示需要等待的事件数量,await方法等待计数器达到零时,表示需要等待的事件都已经发生了。
  3.3,FutureTask也可用作闭锁。FutureTask表示的计算是通过Callable来实现的,get的行为取决于任务的状态,如果任务已经完成这返回,否则阻塞直到任务进入完成状态。FutureTask能够将计算结果从执行线程传递到获取这个结果的线程,实现结果的安全发布。
4,信号量
  4.1,计数信号量(Counting Semaphore)用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量,信号量还可以用来实现某种资源池,或者对容器施加边界。
  4.2,Semaphore管理着一组虚拟的许可,通过acquire方法获得许可,如果当前许可为空将阻塞,直到有许可被还回,通过release方法将还回一个许可
5,栅栏
  5.1,栅栏(Barrier)类似于闭锁,他能阻塞一组线程直到某个事件发生。
  5.2,闭锁用于等待事件,而栅栏用户等待其他线程。
  5.3,CyclicBarrier特别适合将一个问题拆分成一系列相互独立的子问题,当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有线程都被释放,而栅栏将被重置以便下次使用。
  5.4,Exchanger时另一个栅栏,他是两方(Two-Party)栅栏,各方在栅栏位置上交换数据。当执行不对称的操作时。