`
bingzhen66
  • 浏览: 36529 次
文章分类
社区版块
存档分类
最新评论

34.黑马程序员-线程间通讯

 
阅读更多

------- android培训java培训、期待与您交流! ----------

1.线程通讯概述
  • 多个线程同时操作一个资源时,但是操作的动作不同,就涉及线程间通讯。
  • 例如,一个Input线程存入Res共享数据,一个Output线程取出数据。
2.实现步骤
  • 首先,要有操作的资源Res。
  • 再就是要有多个操作线程,如存入线程Input,取出线程Output。
  • 两个线程同时操作资源,为了避免多线程安全,需要同步。
  • 同步时需要加锁,因为线程操作不同,需要建立两个线程类。两个线程类加同一个锁,这个锁需要是唯一的对象Res,字节码文件对象也勉强可以。
3.等待唤醒机制。
  • 怎样解决?
    • 步骤:
    • 定义一个标志,作用是告诉另一个线程这个资源操作完了没有、我用完以后你才可以操作了。
      • 例如:有两个线程,一个存Input,一个取Output,还有一个资源Res。需要存完一个才能取一个,存取线程都需要 同步,持有同一个锁Res。是不是可以存取需要判断一个标记flag(默认false数据为空),可以存是false(里面没有数据),可以取是true(里面有数据)。存的时候首先判断标记,false无数据就开始存,存完以后把标记改为true,然后唤醒notify()另一个线程;如果存的时候标记为true里面有数据,则wait()(等待)。取线程动作相反。注意:这里的wait(),notify()只能用在同步中,必须标示出线程所属的锁(这里是资源Res),并且wait()是定义在Object中的方法还抛了异常,这里不能抛只能try...catch处理。
  • 注意:
    • wait();
    • notify();
    • notifyAll();
    • 都是用在同步中,因为要对持有监视器(锁)的线程操作。只有同步才具有锁。
    • 为什么这些操作线程的方法要定义在Object类中呢?
      • 因为这些方法在操作同步中线程时,都必须要标示他们出操作线程只有的锁。
      • 只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒。
      • 不可以对不同锁中的县城进行唤醒。
      • 也就是说:等待和唤醒必须是同一个锁。
      • 而锁可以是任意对象,所以可以被任意对象调用的方法定义在Object类中。
  • 代码优化
    • 资源一般需要私有化,并且提供一些方法set、get访问资源。set、get方法中包含多行代码也需要同步,这里方法同步就可以。这里面开头定义flag判断,结束定义flag和notify。这样做的好处是存取线程不需要再定义flag、wait、notify了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics