1.wait()/notify()机制
- wait()/notify()都是Object对象的方法,且只能在同步方法或同步块中调用。
- wait()方法使当前线程等待,在wait()执行的地方暂停执行,并释放锁,知道接到通知或被中断为止。
- notify()用来通知那些可能等该该锁的其他线程。若有多个线程等待,则按照执行wait()方法的顺序通知(notify)等待的线程。执行notify()方法后,当前线程不会马上释放该锁,呈wait()状态的线程也并不能马上获取该对象锁,要等到执行notify()方法的线程退出synchronized同步区域后,当前线程才会释放锁,wait状态的线程获得对象锁。
- 当线程调用wait()方法后,再对该线程对象执行interrupt()方法会出现InterruptedException异常
- 每调用一次notify()方法,只通知一个线程进行唤醒,唤醒的顺序与执行wait()方法的顺序一致。
- notifyAll()方法会按照执行wait()方法的倒序依次对其他线程进行唤醒。
- wait(long)方法是指等到某一时间内是否有线程对锁进行notify()通知唤醒,如果超过这个时间则线程自动唤醒。自动唤醒后需要持有锁,如果没有锁,则一直等待,直到持有锁为止。
2. 通过管道进行线程间通信--字节流,字符流
3. join()方法
- join()方法的作用是使所属的线程对象x正常执行run()方法,而使当前线程z进行无限期的阻塞,等待线程x销毁后在继续执行线程z后面的代码,具有串联执行的效果。
- join()方法具有使线程排队运行的效果,有些类似同步的运行效果。但是,join()方法与synchronized的区别是join()方法在内部使用wait()方法进行等待,而synchronized关键字使用锁进行同步。
- join(long)方法中的参数用于设定等待的时间,不管当前线程是否执行结束,时间到了并且重新获得了锁,则当前线程会继续向后运行。如果没有重新获得锁,则一直尝试,知道获得锁为止。
4.类ThreadLocal的使用
- 类threadLocal的主要作用是将数据放入当前线程对象中的Map中,这个Map是Thread类的实例变量。类ThreadLocal自己不管理类,不存储任何数据,它只是数据和Map之间的桥梁,用于将数据放入Map中。(P274 Java多线程编程核心技术)
- 类InheritableThreadLocal可以让子线程从父线程继承值。(P286)
- 父线程有最新的值,子线程仍是旧值。
- 子线程有最新的值,父线程仍是旧值。
- 子线程可以感应对象属性值的变化。