在Java的線程中,明確規(guī)定了6種狀態(tài):NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。
對于第一種狀態(tài),是剛剛使用new Thread()方法創(chuàng)建的線程,還沒有調(diào)用start()方法;
第二種狀態(tài)RUNNABLE,是可以運(yùn)行的狀態(tài),可以是在正在運(yùn)行的狀態(tài),也可以是因?yàn)镃PU調(diào)度沒有運(yùn)行的狀態(tài)(即Ready狀態(tài));
第三種狀態(tài)是被阻塞的狀態(tài),這種狀態(tài)的線程一般是在等待一個鎖,來進(jìn)入一個synchronized的block/method;
第四種狀態(tài)WAITING,出現(xiàn)的原因是調(diào)用了不帶時間參數(shù)的Object.wait()方法、Thread.join()方法或者LockSupport.park()方法。調(diào)用wait()的線程要用Object.notify()/notifyAll()來喚醒,調(diào)用join()方法的線程需要等待某個其他線程中斷或結(jié)束;
第五種狀態(tài)TIMED_WAITING,出現(xiàn)的原因是調(diào)用了帶時間參數(shù)的Thread.sleep()、Object.wait()方法、Thread.join()方法或者LockSupport.park()方法;
第六種狀態(tài)就是中斷狀態(tài),也就意味著該線程已經(jīng)執(zhí)行完畢了。
join方法,當(dāng)B線程中調(diào)用了A線程的join()方法,那么B線程要等到A線程執(zhí)行結(jié)束或者等待了timeout時間才可以繼續(xù)執(zhí)行join()方法后面的步驟。