Java 多线程 (三)

  • 线程通信

 

多线程并发执行时, 在默认状况下CPU是随机切换线程, 若是但愿线程执行的顺序按咱们的规律执行, 就须要线程之间协调通信java

 

线程通信方式多线程

  • 休眠唤醒方式
  1. -- Object: wait、notify、notifyAll(以上必须配合synchronized块使用)    
  2. -- Condition(Lock.newCondition()): await、signal、signalAll
  • CountDownLatch: 用于某个线程等待其余线程执行完后再执行

CountDownLatch底层原理是经过一个计数器来实现的, 计数器的初始值为(等待)线程的数量, 执行减一操做, 到0后意味着某个线程就能够执行了并发

好比A线程等待前面有3个线程执行完成后再执行, 计数器标记count=3, 第一步执行await()方法等待检查当前的count是不是0, 不是0 ,则A线程阻塞, 在其余3个线程执行时各自分别调用countDown()方法, 对count-1操做, 直到count=0, 就去唤醒(resume())A线程工做学习

  • CyclicBarrier: 一组线程等待至某个状态以后再所有同时执行

CyclicBarrier 底层基于 ReentrantLock 和 Condition 实现spa

  • Semaphore: 用于控制对某组资源的访问权限 (适合资源少,线程多的场景) 

 

wait 和 sleep 区别线程

  wait sleep
同步 只能在synchronized同步块中使用 不须要依赖synchronized
做用对象 wait方法定义在Object类中,做用于对象自己 sleep方法定义在java.lang.Thread中,做用当前线程
释放锁资源 不会
唤醒条件 其余线程调用对象的notify或notifyAll 超时或调用interrupt()
方法属性 实例方法(Object.wait()) 静态方法

 

                                                                                                                Go. 学习线程 还须要了解Java内存模型 也是核心基础对象

相关文章
相关标签/搜索