多线程的通信问题

前提:

1:当多个线程并发执行时, 在默认情况下CPU是随机切换线程的,每个线程执行的次序都是随机的。

2:如果我们需要多个线程共同完成一个任务,并且希望他们有规律的执行(有可能是多线程间交替执行,有可能是当某个线程达到某个条件后才让其他线程执行),就需要线程之间协调通信。 

3:我认为处理线程安全的同步锁机制,也算是线程间的通信。

解决方案:等待唤醒机制

1:一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。而且synchronized的锁对象和调用wait()、notify/notifyAll() 方法的对象必须是同一个对象。

2:由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。

3:wait()使当前线程阻塞,当线程执行wait()方法的时候,会释放当前的锁,然后让出CPU,进入等待状态。 

4:只有当线程执行 notify/notifyAll() 方法的时候,才会唤醒一个或多个正处于等待状态的线程,然后当前线程继续往下执行,直到执行完synchronized 代码块的代码或是中途遇到wait() ,才会再次释放锁。

5:notify/notifyAll() 的执行只是唤醒沉睡的线程,而不会立即释放锁,锁的释放要看代码块的具体执行情况。所以在编程中,尽量在使用了notify/notifyAll() 后立即退出同步代码块或者调用wait(),以唤醒其他线程让其获得锁

例子:

原文地址:https://www.cnblogs.com/hzcya1995/p/13302453.html