java 线程 sleep, wait, join, yield
java 线程 sleep, wait, join, yield wait() 调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意, 调用wait()方法后,会释放对象的锁。 wait(long) 超时等待一段时间,这里的参数是毫秒,也就是等待长达n毫秒,如果没有通知就超时返回。 wait(long, int) 对于超时时间更细粒度的控制,可以达到毫秒。 Thread.sleep(3000); TimeUnit.SECONDS.sleep(random.nextInt(10)); this.wait(2000); sleep sleep 是 Thread 类的静态方法, sleep() 使当前线程进入停滞状态 (阻塞当前线程), 让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会; Thread.sleep 不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.sleep不会让线程释放锁。 所以当在一个 Synchronized 块中调用 Sleep() 方法时,线程虽然休眠了,但是对象的锁并没有被释放,其他线程无法访问这个对象 (即使睡着也持有对象锁) 。 在 sleep() 休眠时间期满后,该线程不一定会立即执行, 这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。 如果能够帮助你记忆的话,可以简单认为和锁相关的方法都定义在 Object 类中,因此调用 Thread.sleep 是不会影响锁的相关行为。 wait() 方法是 Object 类里的方法; 当一个线程执行到 wait() 方法时,它就进入到一个和该对象相关的等待池中,同时失去 (释放) 了对象的锁 (暂时失去锁,wait(long timeout)超时时间到后还需要返还对象锁) wait() 使用 notify 或者 notifyAll 或者指定睡眠时间来唤醒当前等待池中的线程。 wiat() 必须放在 synchronized block 中,否则会在 program runtime 时扔出 “java.lang.IllegalMonitorStateException” 异常。 ...