深入理解多线程三

涉及到:
1.使用wait/notify实现线程间的通信
2.生产者/消费者模式的实现
3.方法join的使用
4.ThreadLocal类的使用
 
一.等待/通知机制
    线程与线程之间不是独立的个体,他们彼此之间可以相互通信和协作.
    wait()方法是Object类的方法,它的作用是使当前执行代码的线程进行等待,并释放对象锁,只能在同步方法或同步块中调用wait方法.
    notify()在要在同步方法或同步块中调用,作用是可以随机唤醒等待队列中等待同一共享资源的"一个"线程,并使该线程退出等待队列,进入可运行状态,注意的是执行notify()之后,当前线程不会马上释放该对象锁,呈wait()状态的线程也不能马上获取该对象锁,要等到执行notify()方法的线程将程序执行完,,也就是退出synchronized代码块后,当前线程才释放锁,呈wait()状态所在的线程才可以获取该对象锁.
    notifyAll()方法可以使所有正在等待队列中等待同一共享资源的"全部"线程从等待状态退出,进入可运行状态.
    wait使线程停止运行,notify方法使停止的线程继续运行.
    每个锁对象都有两个对列,一个是就绪对列,一个是阻塞队列.就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程,一个线程被唤醒之后,才会进入就绪队列,等待CPU的调度;反之,一个线程被wait之后,就会进入阻塞队列,等待下一次被唤醒.
二.实例说明,请看下一篇.
三.join的使用:
    方法join的作用是等待线程对象销毁,所用是使所属的线程对象x正常执行run()方法中的任务,从而使当前线程无期限的阻塞,等待线程x销毁后再继续执行当前线程后面的代码.
    join与synchronized的区别是:join在内部使用wait()方法进行等待,二synchronized关键字使用的是"对象监视器"原理作为同步.
    join与interrupt()方法彼此遇到,会报错.
    join(long)与sleep(long):join(long)方法具有释放锁的特点,而Thread.sleep(long)方法具有不释放锁的特点.
四:类ThreadLocal的使用:
    类ThreadLocal主要解决的是每个线程绑定自己的值,实例说明.
原文地址:https://www.cnblogs.com/wadmwz/p/7804051.html