1、等待/通知机制
wait()方法:是当前执行代码的进程进行等待,直到接到通知或被中断为止,wait()是object类的方法。
调用wait方法钱必须获得对象锁——只能在同步方法中调用wait()方法;
执行完wait方法之后线程释放,从wait返回前需要和其他线程竞争重新获得锁。
wait如果没有持有适当的锁,则会抛出IllegalMonitorStateException(RuntimeException)
在wait时,调用interrupt()方法会出现InterruptException异常。
wait(long),一定时间未被唤醒自动唤醒
notify()方法: 用来通知可能在等待该对象的对象锁的其他线程
也需要在同步方法中调用——获得锁,如果未获得适当的锁也会抛错;
唤醒的线程是随机的,一次一个;
notify所在的同步代码块执行完了才会释放锁。
多个线程的时候,notify了 一个线程,其他线程只能等待再次notify或则notifyall;
notifyAll唤醒所有线程
线程状态的切换:
2、通过管道进行线程间通信
字节流:PipeInputStream,PipeOutputStream
字符流:PipeReader,PipeWriter
3、join()方法
join()的作用就是等待线程对象的销毁
join的作用是使主线程无限期阻塞,等子线程销毁之后在继续执行主线程之后的代码;
join的原理是在内部使用wait等待,而synchronized关键是使用的对象监视器原理做同步join(long) 和sleep(long)的区别:join(long)释放锁,sleep(long)不释放锁
4、ThreadLocal
每个线程绑定自己的值,解决了变量在不同线程间的隔离性
initValue()设置默认值
InheritableThreadLocal可以在子线程中取得父线程继承下来的值
childValue() 改变继承的值