Java多线程--线程间通信

来源:互联网 发布:php 电商系统 编辑:程序博客网 时间:2024/06/03 05:06

等待/通知机制

1 等待/通知机制的实现

  • wait()
    1. 使当前执行代码的线程进行等待,该方法用来将当前线程置入“预执行队列”中,并且在wait方法所在的代码行停止执行,直到接到通知或被中断为止
    2. 在执行wait()方法后,当前线程释放锁
  • notify()
    1. 用来通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规划器随机挑选
    2. 并不马上释放对象锁,需要等到执行notify()方法的线程将程序执行完,也就是退出synchornized代码块后

2 方法wait()锁释放和方法notify()锁不释放

当方法wait()被执行完后,锁会被自动释放;当方法notify()被执行完后,锁不会被自动释放

3 当interrupt()方法遇到wait()方法

  • 当线程处于wait状态,调用线程对象的interrupt()方法会出现InterruptedException异常

4 只通知一个线程

调用notify()方法一次只随机通知一个线程进行唤醒
多次调用notify()方法,会随机将等待wait状态的线程进行唤醒

5 唤醒所有线程

使用notifyAll()方法,唤醒所有的线程

6 wait(long)方法

等待某一段时间内是否有线程对锁进行唤醒,如果超过这个时间就自动唤醒

方法join()的使用

使所属的线程对象x正常执行run()方法中的任务,而是当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行线程z后边的代码

1 join()和异常

在join()过程中,如果当前线程对象被中断,则当前线程出现异常

2 方法join(long)的使用

通过参数设置等待时间

3 方法join(long)和sleep(long)的区别

方法join(long)在内部是使用wait(long)来实现的,所以其具有释放锁的特性;而sleep(long)不会释放锁

ThreadLocal的使用

实现每个线程都有自己的共享变量,每个线程绑定自己的值

1 解决get()返回null值问题

继承ThreadLocal类,覆盖initialValue方法

InheritableThreadLocal的使用

可以在子线程中取得父线程继承下来的值

可以在继承的同时对值进行进一步的处理

0 0
原创粉丝点击