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。实际效果取决于线程调度器的实现。