sleep,wait,yield,join方法的使用与区别

1. sleep() 方法

在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁”。
sleep()使当前线程进入阻塞状态,在指定时间内不会执行。

Thread.sleep(1000);

2. wait() 方法

wait() 方法是 Object 类的一个 final 方法,其定义如下:

public final void wait() throws InterruptedException {
  wait(0);
}

调用 wait() 方法后,在其他线程调用对象的 notify() 或 notifyAll() 方法前,当前线程处于等待状态。当前线程会释放掉它所占有的“锁”,从而使别的线程有机会抢占该锁。

当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出 IllegalMonitorStateException 异常。

唤醒当前对象锁的等待线程使用 notify() 或 notifyAll() 方法,也必须拥有相同的对象锁,否则也会抛出 IllegalMonitorStateException 异常。

waite() 和 notify() 必须在 synchronized 函数或 synchronized 块中进行调用。如果在 non-synchronized 函数或 non-synchronized 块中进行调用,虽然能编译通过,但在运行时会发生 IllegalMonitorStateException 的异常。

3. yield() 方法

暂停当前正在执行的线程。

yield() 只是使当前线程重新回到可执行状态,所以执行 yield() 的线程有可能在进入到可执行状态后马上又被执行。

yield() 只能使同优先级或更高优先级的线程有执行的机会。

4. join() 方法

等待该线程终止。

其他线程会等待调用join方法的线程结束,再继续执行。
如:t.join(); // 主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。

测试示例如下:

public class Test {

  /**
   * @Title: main
   * @Description: join 测试
   * @param args
   * @version 1.0
   */
  public static void main(String[] args) {
    Thread t1 = new MyThread1();
    t1.start();

    for (int i = 0; i < 10; i++) {
      System.out.println(Thread.currentThread().getName() + " 线程第" + i + "次执行!");

      if (i > 0) {
        try {
          // t1线程调用 join() 后,主线程停止执行,直到t1执行完毕后继续执行
          t1.join();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }
  }

}

class MyThread1 extends Thread {
  @Override
  public void run() {
    for (int i = 0; i < 10; i++) {
      System.out.println(Thread.currentThread().getName() + " 线程第" + i + "次执行!");
    }
  }
}

执行结果:

main 线程第0次执行!
Thread-0 线程第0次执行!
main 线程第1次执行!
Thread-0 线程第1次执行!
Thread-0 线程第2次执行!
Thread-0 线程第3次执行!
Thread-0 线程第4次执行!
Thread-0 线程第5次执行!
Thread-0 线程第6次执行!
Thread-0 线程第7次执行!
Thread-0 线程第8次执行!
Thread-0 线程第9次执行!
main 线程第2次执行!
main 线程第3次执行!
main 线程第4次执行!
main 线程第5次执行!
main 线程第6次执行!
main 线程第7次执行!
main 线程第8次执行!
main 线程第9次执行!

从结果可以看出:t1线程调用 join() 后,主线程停止执行,直到t1执行完毕后继续执行



原文:
Java中sleep,wait,yield,join的区别

猜你喜欢

转载自blog.csdn.net/zhouxukun123/article/details/79834806