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