今天学习完了第八天的内容。总结一下多线程的知识。
多线程中的几个方法:wait()/yield()/join()/notify()/notifyAll()/sleep()
yield()方法,表示进程让出cpu的使用权,让其他线程来占用。它仅能让一个线程进入到可运行该状态,而不是等待或者阻塞状态。
wait()方法,等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则,编译时可以通过,但运行时会报IllegalMonitorStateException的异常。调用任意对象的wait()方法,导致该线程阻塞,该线程不能继续执行,并且该对象上的锁被释放。
join()方法,线程实例方法,可以使得一个线程在另外一个线程结束后再运行,如果join()方法在一个线程实例上调用,当前运行着的线程将会阻塞直到这个线程实例完成了运行。在join()方法内设定超时时间,使得join()方法的影响在特定超时后失效。
notify()方法,唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。
notifyAll()方法,唤醒所有等待的线程,注意唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的。
sleep(int msc)方法,让线程休眠一段时间。
生产者消费者模式中,如果只有一个生产者,而有多个消费者时,如果只使用notify(),而不是使用notifyAll(),有可能会产生死锁。
转载于:https://blog.51cto.com/skdevps/1785678