Java多线程中的join()与yield()方法解析

Java Q&A Hub 使用 GPT-4o-mini 回答

问题:

Java面试题之多线程 讲下join,yield方法的作用,以及什么场合用它们?

回答:

在Java多线程编程中,join()yield()是两个重要的方法,它们在不同的场合下有不同的作用。

1. join() 方法

作用:

join() 方法是 Thread 类中的一个实例方法,用于等待一个线程完成。调用 join() 的线程会被阻塞,直到被调用的线程执行完毕。

使用场合:

  • 当你希望在一个线程完成后再继续执行当前线程时,可以使用 join()。例如,在一个主线程中启动多个子线程,并希望在所有子线程完成后再进行后续操作。

示例:

class MyThread extends Thread {
    public void run() {
        System.out.println("Thread is running");
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        MyThread thread = new MyThread();
        thread.start();
        thread.join(); // 等待 thread 完成
        System.out.println("Thread has finished");
    }
}

2. yield() 方法

作用:

yield() 方法也是 Thread 类中的一个静态方法,用于提示线程调度器当前线程愿意让出 CPU 的使用权。调用 yield() 的线程会从运行状态转为就绪状态,允许其他同优先级的线程获得执行机会。

使用场合:

  • 当你希望让当前线程暂时放弃 CPU 使用权,以便其他线程可以执行时,可以使用 yield()。这通常用于优化 CPU 使用,尤其是在多线程竞争资源的情况下。

示例:

class MyThread extends Thread {
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " is running");
            Thread.yield(); // 暂时让出 CPU
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

总结

  • join() 用于等待一个线程完成,适合在需要确保某个线程执行完毕后再继续执行的场合。
  • yield() 用于让当前线程放弃 CPU 使用权,适合在需要优化线程调度或资源竞争的场合。

在实际开发中,合理使用这两个方法可以提高程序的效率和可读性。