join()
join() 方法的主要作用是使当前线程(调用 join() 方法的线程)等待目标线程完成执行。当目标线程执行完毕后,当前线程才会继续执行。
 
 代码示例:
public class JoinExample {
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 1 - " + i);
                try {
                    Thread.sleep(500); // 模拟一些工作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 2 - " + i);
                try {
                    Thread.sleep(500); // 模拟一些工作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread1.start();
        thread2.start();
        try {
            thread1.join(); // 等待 thread1 结束
            thread2.join(); // 等待 thread2 结束
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Both threads have finished.");
    }
}
 

yield()
yield() 方法是 Java Thread 类的一部分,用于线程调度。调用 yield() 方法的线程会建议调度器将其执行资源让给其他同优先级的线程。如果没有其他同优先级的线程可运行,或者所有同优先级的线程都在等待,当前线程可能会继续运行。需要注意的是,yield() 是一个静态方法,调用时并不会释放持有的锁。
 
 代码示例:
public class YieldExample {
    public static void main(String[] args) {
        Thread producer = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Producer: " + i);
                Thread.yield(); // 提示调度器让出 CPU
            }
        });
        Thread consumer = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Consumer: " + i);
                Thread.yield(); // 提示调度器让出 CPU
            }
        });
        producer.start();
        consumer.start();
    }
}
 
在这个示例中,两个线程 producer 和 consumer 交替打印信息。每次打印后,线程会调用 Thread.yield(),提示调度器当前线程愿意让出 CPU。实际效果取决于线程调度器的实现。

















