• sleep() 执行后线程进入阻塞状态
  • yield() 执行后线程进入就绪状态
  • join() 执行后线程进入阻塞状态

yield()让当前运行线程回到可运行状态(让出时间片),使相同或更高优先级的其他线程获得运行机会,但实际中无法保证yield()达到让步目的,因为让步的线程可能被线程调度程序再次选中。

join()让当前线程需要等待调用join()方法的线程终止之后才继续执行。

private void exit() {
        if (group != null) {
            group.threadTerminated(this);
            group = null;
        }
        /* Aggressively null out all reference fields: see bug 4006245 */
        target = null;
        /* Speed the release of some of these resources */
        threadLocals = null;
        inheritableThreadLocals = null;
        inheritedAccessControlContext = null;
        blocker = null;
        uncaughtExceptionHandler = null;
    }
void threadTerminated(Thread t) {
        synchronized (this) {
            remove(t);

            if (nthreads == 0) {
                notifyAll();
            }
            if (daemon && (nthreads == 0) &&
                (nUnstartedThreads == 0) && (ngroups == 0))
            {
                destroy();
            }
        }
    }
sleep & wait
wait(),notify(),notifyAll()是属于Object类中的,而sleep()方法属于Thread类
sleep()方法会使线程暂停执行,等待指定的时间,让出cpu给其他线程,但是依然保持监控状态,指定时间结束后又会自动恢复运行
调用sleep()方法并不会释放对象锁
调用wait()方法线程会释放对象锁,当调用该对象的notify()或notifyAll()方法后本线程才会被唤醒

老污的猫
30 声望5 粉丝