在Java中,join()
和wait()
方法都用于線程間的通信和協作,但它們的用途和機制有所不同。
join()
方法:
join()
方法屬于Thread
類,用于等待一個線程完成(終止)后,再繼續執行當前線程。當一個線程調用另一個線程的join()
方法時,當前線程會被阻塞,直到被調用線程完成執行。這樣可以確保被調用線程的結果被當前線程正確處理。join()
方法可以用于實現線程之間的同步和順序執行。示例:
public class JoinExample {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
System.out.println("Thread 1 is running");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 finished");
});
t1.start();
t1.join(); // Main thread will wait for t1 to finish
System.out.println("Main thread continues after t1 finished");
}
}
wait()
方法:
wait()
方法屬于Object
類,用于讓當前線程等待某個條件成立。當一個線程調用對象的wait()
方法時,該線程會釋放對象的鎖并進入等待狀態。當其他線程調用相同對象的notify()
或notifyAll()
方法時,等待狀態的線程將被喚醒。wait()
方法通常與synchronized
關鍵字一起使用,以實現線程間的同步和條件通知。示例:
public class WaitNotifyExample {
private final Object lock = new Object();
public void producer() {
synchronized (lock) {
System.out.println("Producing data...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Data produced, notifying consumer");
lock.notify(); // Notify the consumer thread
}
}
public void consumer() {
synchronized (lock) {
while (true) {
try {
lock.wait(); // Wait for data to be produced
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Consuming data...");
break;
}
}
}
public static void main(String[] args) {
WaitNotifyExample example = new WaitNotifyExample();
Thread producerThread = new Thread(example::producer);
Thread consumerThread = new Thread(example::consumer);
consumerThread.start();
producerThread.start();
}
}
總結:
join()
方法用于等待一個線程完成,然后繼續執行當前線程。它屬于Thread
類,用于實現線程間的同步和順序執行。wait()
方法用于讓當前線程等待某個條件成立。它屬于Object
類,用于實現線程間的同步和條件通知。wait()
方法通常與synchronized
關鍵字和notify()
/notifyAll()
方法一起使用。