1. 什么是线程通信
当多个线程处理同一份数据且各线程任务不同时,就需要线程之间进行通信来避免对数据的争夺,从而保证数据的正确性。
2. 为什么使用线程通信
多线程并发时,默认情况下CPU是随机切换线程的。当我们需要多个线程共同完成一件任务并希望他们有规律执行时,那么这些线程间就需要协调通信以达到多线程共同操作一份数据。
3. 线程通信的方法
通过Object类的wait(),notify(),notifyAll()方法来实现线程间的通信。
方法名 | 说明 |
---|---|
wait() | 通知当前线程进入等待状态并释放所持有的锁。 |
notify() | 唤醒当前对象监视器上等待的单个线程。 |
notifyAll() | 唤醒当前对象监视器上等待的所有线程。 |
4. 一些问题:
为什么notify(), wait()等函数定义在Object中,而不是Thread中?
Object中的wait(),notify()函数和sysnchronized一样,会对对象的同步锁进行操作。
wait()使当前线程进入等待并释放同步锁直到另一个线程(称唤醒线程)调用nofity()方法后等待线程才能继续执行,重点来了,这里的同步锁是对象持有的,且每个对象有且仅有一个!notify()只能唤醒同一对象监视器中调用wait()的线程,所以这些方法定义在对象中。也只有对象才能提供锁这个唯一的标识。
yield() 与 wait()的比较
1.wait()是让线程由“运行状态”进入到“等待状态”,而yield()让线程由“运行状态”进入到“就绪状态”。
2.wait()让线程释放对象同步锁,而yield()不会。
sleep() 与 wait()的比较
两者都会令当前线程进入“阻塞状态”但是wait()会释放对象的同步锁,而sleep()则不会释放锁。