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。實際效果取決于線程調度器的實現。