1)方法wait的作用是使当前执行代码的线程进行等待,将当前线程置入预执行队列,并且在wait所在代码行处停止执行,直到接到通知或者中断。在wait之前,要获得一个对象锁,即wait只能在同步方法/块中使用,执行wait之后立即释放锁。wait状态不能被interrupt,会抛异常。
2)notify随机唤醒等待队列中等待同一共享资源的线程。notify也要获得一个对象锁,即notify也只能在同步方法/块中使用,执行notify之后,线程继续执行后面的代码,直到全部完成,才会释放锁。之后由线程规划器挑出一个等待状态的线程对其发出notify,并使其获得对象锁,让其执行wait之后的语句,再释放掉锁。
3)notifyAll唤醒所有等待的线程
4)wait(long)等待某一个时间内是否有线程对锁进行唤醒,如果超过这个时间就自动唤醒
5)生产者、消费者模式原来都是基于wait/notify原理
6)管道流pipeStream是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据,通过使用管道,实现不同线程间的通信。Java提供了四个类来使线程间进行通信:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter。使用方法:在外部定义一个PipedInputStream和一个PipedOutputStream,然后让PipedOutputStream连接(connect)PipedInputStream,然后将这两个流分别给到输入数据和输出数据的线程,两个线程之间就可以传输字节或者字符流了
7)join的作用是等待线程对象销毁。主线程创建子线程,若子线程耗时严重,主线程将会先于子线程完成。这时如果主线程想等待子线程执行完成之后再结束,比如获取子线程处理完成的数据,这时就用到了join。主线程启动子线程a,然后a.join就会一直阻塞在那,直到a运行完成
8)线程join时不能被interrupt,会抛异常;join(long)设置等待时间,结束后也会释放锁(但sleep不会释放锁)
9)ThreadLocal解决的是每个线程绑定自己的值,每个线程都可以执行ThreadLocal.set(object)将自己的值放入,再通过get()获取自己的值。ThreadLocal解决的是变量在不同线程间的隔离性,也就是不同线程拥有自己的值。