(1) 使用wait/notify实现线程间的通信
Wait()方法的作用是:使当前执行代码的线程进行等待,是object类的一个方法,该方法用来将当前线程置入预执行队列中,并且在wait()所在的代码行处停止执行,知道接到通知或被中断为止。
在调用wait()方法之前,线程必须获得该对象的对象级别的锁,即只能在同步方法或同步块中调用wait()方法。在执行wait()方法后,当前线程释放锁。
wait()方法可以是调用该方法的线程共享资源的锁,然后从运行状态退出,进入等待队列,直到被再次唤醒。
notify()方法也是在同步方法或同步块中调用,即在调用前,线程必须获得该对象的对象级别的锁。执行完该方法锁却不自动释放。
notify()方法可以唤醒等待队列中的等待同一个共享资源的一个线程,并使该线程退出等待队列,进入可运行状态,也就是notify()方法仅通知一个线程。
notifyAll()方法可以使所有正在等待队列中等待同一个共享资源的全部线程从等待状态退出,进入可运行状态。
总结wait和notify:wait使线程停止运行,而notify使停止的线程继续运行。
线程状态切换:
1) 新创建一个新的线程对象后,在调用它的start()方法,系统就会为此线程分配CPU的资源,是其处于Runnable(可运行)状态,这一个准备运行的阶段。若果线程强占到CPU资源,此线程就处于Running(运行)状态。
2) Runnable状态和Running转态可相互切换,因为有可能线程运行一段时间后,有其它优先级的线程抢占到了CPU资源,这是线程就从Running状态变化Runnable转态。
线程进入Runnable状态大体分为如下情况
A:调用sleep()方法后经过的时间超过了指定的休眠时间
B:线程调用的阻塞IO已经返回,阻塞方法执行完毕
C:线程成功地获得了视图同步的监视器
D:线程正在等待某个通知,其它线程发出来了通知
E:处于挂起转态的线程调用了resume恢复方法
3) Blocked阻塞,Blocked状态结束后,进入Runnable状态,等待系统重新分配资源。
出现Blocked状态大体分为如下情况
A:线程调用sleep()方法,主动放弃占用的处理器资源。
B:线程调用的阻塞IO方法,在该方法返回前,该线程被阻塞。
C:线程试图获得了一个视图同步的监视器,该同步监视器正被其他线程所持有。
D:线程正在等待某个通知。
E:程序调用suspend方法处于该方法将线程挂起,此方法容易导致死锁,尽量避免使用该方法。
4) run()方法运行结束后进入销毁阶段,整个线程执行完毕。
(2) 方法join的使用
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往早于子线程之前结束。这时,如果主线程想等待子线程执行完之后在结束,比如子线程处理一个数据,主线程要取得这个数据中的值,就是要用jion()方法。
join()方法作用:等待线程对象销毁。具有使线程排队列运行的作用,有些类似同步的运行效果。
join和synchronized的区别:
jion在内部使用了wait()方法进行等待,而sychronized关键字使用的是对象监视器原理作为同步。
(3) ThreadLocal类的使用
类TreadLocal主要解决的就是每个线程绑定自己的值,可以讲TreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据。