改变线程状态的几种方法,容易忘记:
RUNNING -> BLOCKED: sleep, wait, join
RUNNING -> RUNNABLE: yield
yield: 和priority相关
join: wait for this thread to die
public class JoinTest {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable(){
public void run(){
System.out.println("First task started");
System.out.println("Sleeping for 2 seconds");
try{
Thread.sleep(2000);
} catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("First task completed");
}
});
Thread t1 = new Thread(new Runnable(){
public void run(){
System.out.println("Second task completed");
}
});
t.start(); // Line 15
t.join(); // Waits for this thread to die, then execute others
t1.start();
}
}
First task started
Sleeping for 2 seconds // join: t1 has to wait for t to die
First task completed
Second task completed
join源码:
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
join调用了wait,但是并没有notify, rt.jar也没有一个notify的地方,因为jvm源码中,线程执行完毕了exit过程有一个notifyall操作
参考: