在Java的线程中,明确规定了6种状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。
对于第一种状态,是刚刚使用new Thread()方法创建的线程,还没有调用start()方法;
第二种状态RUNNABLE,是可以运行的状态,可以是在正在运行的状态,也可以是因为CPU调度没有运行的状态(即Ready状态);
第三种状态是被阻塞的状态,这种状态的线程一般是在等待一个锁,来进入一个synchronized的block/method;
第四种状态WAITING,出现的原因是调用了不带时间参数的Object.wait()方法、Thread.join()方法或者LockSupport.park()方法。调用wait()的线程要用Object.notify()/notifyAll()来唤醒,调用join()方法的线程需要等待某个其他线程中断或结束;
第五种状态TIMED_WAITING,出现的原因是调用了带时间参数的Thread.sleep()、Object.wait()方法、Thread.join()方法或者LockSupport.park()方法;
第六种状态就是中断状态,也就意味着该线程已经执行完毕了。
join方法,当B线程中调用了A线程的join()方法,那么B线程要等到A线程执行结束或者等待了timeout时间才可以继续执行join()方法后面的步骤。