JAVA线程中join,wait,notify&¬ifyAll
一.概述
在编写多线程程序的时候,我们经常需要考虑线程之间的同步,比如我们使用join可以让某一线程执行结束,使用wait可以让某一线程在某个地方等待,使用notify或者notifyAll可以唤醒处于等待状态的线程。这里我们来看看这几个线程自带方法的使用以及相关的分析。
二.join()的使用
join()方法是Thread类的,在Thread类中提供三种join()方法
1 2 3 4 5 6 7 8 | // 设置毫秒级别的等待 public final synchronized void join(long millis) throws InterruptedException {//...} // 设置毫秒级别,纳秒级别的等待 public final synchronized void join(long millis, int nanos) throws InterruptedException {//...} // 持续等待,没有时间限制 public final void join() throws InterruptedException {//...} |
如果我们写下面的代码
1 2 3 4 | Thread t1 = new ... t1.start(); t1.join(); System.out.println("t1 has finished..."); |
此时控制台的输出一定是在线程t1执行结束后,从这点我们可以利用join来控制多个线程直线的执行顺序,比如要想线程t2在线程t1执行结束后执行,我们在调t2的start方法之前调用t1的join方法即可。
三.wait()&¬ify()&¬ifyAll()的使用
wait(),notify(),notifyAll()这三个方法是任何一个java对象都具有的方法。
在某一对象上调用wait()方法,当前线程就会在该对象上处于等待状态。
在某一对象上调用notify()方法,就会唤醒一个在当前对象上处于wait状态的线程,要是当前对象上有N个线程处于wait状态,就会任意选取一个唤醒。
在某一对象上调用notifyAll()方法,就会唤醒在某一对象上处于wait的所有线程。
注意wait()和notify()的时候要使用相同的Object。
四.绿色线程&&本地线程
最近在搜索的时候发现了一个绿色线程的概念,很好奇,继续搜索了一把,发现绿色线程在jdk1.1的时候存在,后面就给干掉了,绿色线程的意思就是这个线程只是一个JVM可调度运行的任务,不会对应一个OS层面的上的线程。本地线程必须对应一个OS层面的线程。
五.总结
线程的同步我们一般不太会使用join,wait,notify以及notifyAll等来同步,直接使用juc包中的一些类,但是我们需要明白这些方法的具体含义。