Thread.join 中使用 Object.wait 实现:
- //java.lang.Thread
- public final synchronized void join(long millis)
- throws InterruptedException {
- long base = System.currentTimeMillis();
- long now = 0;
- if (millis < 0) {
- throw new IllegalArgumentException("timeout value is negative");
- }
- if (millis == 0) {
- while (isAlive()) {
- wait(0);
- }
- } else {
- while (isAlive()) {
- long delay = millis - now;
- if (delay <= 0) {
- break;
- }
- wait(delay);
- now = System.currentTimeMillis() - base;
- }
- }
- }
wait 方法, jdk 文档中的解释时: Causes the current thread to wait ,wait 方法会让当前线程从 runnable 变成 waitting 的状态. 怎么理解这句话呢? 首先每个对象都可以作为一个锁, wait 方法是根类 Object 的方法, 每个对象都有其 wait 方法, 在 main 方法中执行如下代码:
- public class Program{
- public static void main(String[] args) throws Exception{
- MyThread myThread = new Thread(new Runnable(){
- @Override
- public void run() {
- //this 就是当前对象 myThread, 同步获取到 myThread 锁
- synchronized (this) {
- this.notify();// 唤醒在 myThread 锁上等待的单个线程. 即 main 主线程从 waitting 变成 runnable,main 方法继续执行
- }
- }
- });
- myThread.setName("myThread");
- myThread.start();
- // 同步获取到 myThread 锁
- synchronized (myThread) {
- // 使当前线程 (main) 从 runnable 进入 waitting 状态, 等待其他某个线程调用 myThread 锁的 notify 方法
- myThread.wait();
- }
- }
myThread 对象就是一个锁, main 方法 synchronized (myThread)获取到锁, 并执行该锁的 wait 方法, 使 main 线程一直等待, 当线程 MyThread 中获取同一个锁, 并执行该锁的 notify 方法, 使之前因该锁等待 main 方法可以继续执行.
来源: http://www.bubuko.com/infodetail-3457395.html