wait等待和notify唤醒机制
使用wait方法需要在同步方法内,换句话说就需要在synchronized关键字的方法里面。wait方法是通过object调用的,而object就是synchronized上锁的东西。如果不在对象级别的锁内进行调用会抛出异常。
wait和suspend
wait方法与suspend方法有共同的点。wait为等待suspend为暂停,当运行到该方法时,线程将会停止往下运行,进入阻塞状态。但是wait方法会将自己获得的锁资源释放掉,而suspend则不会,容易导致死锁,需要尽量避开使用该方法。
当调用wait方法使线程进入等待状态的时候需要调用notify方法将其唤醒。同样的,notify方法也需要在在同步方法内,调用notify方法后只可以唤醒一个相同对象的wait,notify只会唤醒等待队列中的第一个线程,而其他线程不会被唤醒。被唤醒的线程不会直接得到锁的资源,因为现在的锁还在notify所在的synchronized中,所以需要等到notify所在的代码块运行结束释放锁资源以后才会轮到被唤醒的线程继续运行,并且会把资源优先给他。如果调用的是notifyAll方法则会将该对象所有wait的线程全部唤醒,但是他们也不会异步运行,他们会抢夺锁资源,最后只有一个线程会获取资源并且开始运行。
线程之间的通讯,利用管道
在多线程中,多线程之间的通信可以借用管道,一个线程将数据发送至输出管道,另一个线程从输入管道中读取数据。PipedInputStream和PipedOutStream(字节流管道)、PipedRead和PipedWrite(字符流管道)。管道之间用.connect进行连接。http://blog.csdn.net/zlp1992/article/details/50298195
join与yield与sleep
join()的作用与yield()方法正好相反,join()的作用是当有多个线程时,先执行join()当jion()结束才能去执行其他线程。
join(time) 和sleep(time)的方法有相似。join(time)的意思就是"我停下time的时间让别人先去执行",而sleep(time)是"我要停下time的时间,所有人和我一起休息吧"。值得注意的是,join(time)往往会首先抢到锁的资源,然后释放掉,等时间到了,在回到之前运行的地方继续执行。
线程自己的存储空间-ThreadLocal
ThreadLocal可以储存线程自己的私有数据,通过set和get方法进行设置和获取。如果ThreadLocal没有设置过初始值的话获取数来的将会是null。设置初始值可以通过重写initialValue来设置初始值。