调用无参数的Thread.join()方法。其中join()方法是一种线程的同步方法。例如,在threadA线程中调用threadB线程的join()方法,则threadA线程会等待threadB线程执行完。而threadA线程在等待threadB线程执行的过程中,其状态会从RUNNABLE转换到WAITING。当threadB执行完毕,threadA线程的状态则会从WAITING状态转换成RUNNABLE状态。
场景三
调用LockSupport.park()方法,当前线程会阻塞,线程的状态会从RUNNABLE转换成WAITING。调用LockSupport.unpark(Thread thread)可唤醒目标线程,目标线程的状态又会从WAITING状态转换到RUNNABLE。
RUNNABLE与TIMED_WAITING状态转换总体上可以分为五种场景。
场景一
调用带超时参数的Thread.sleep(long millis)方法;
场景二
获得synchronized隐式锁的线程,调用带超时参数的Object.wait(long timeout)参数;
场景三
调用带超时参数的Thread.join(long millis)方法;
场景四
调用带超时参数的LockSupport.parkNanos(Object blocker, long deadline)方法;
场景五
调用带超时参数的LockSuppor.parkUntil(long deadline)方法。
从NEW到RUNNABLE状态Java刚创建出来的Thread对象就是NEW状态,创建Thread对象主要有两种方法,一种是继承Thread对象,重写run()方法;另一种是实现Runnable接口,重写run()方法。
注意:这里说的是创建Thread对象的方法,而不是创建线程的方法,创建线程的方法包含创建Thread对象的方法。
继承Thread对象
public class ChildThread extends Thread{ @Override public void run(){ //线程中需要执行的逻辑 } } //创建线程对象 ChildThread childThread = new ChildThread();