Phương thức join trong Java Thread có thể được sử dụng để tạm dừng việc thực thi của thread hiện tại cho đến khi thread được chỉ định kết thúc. Có ba phiên bản của phương thức join
.
Phương thức join trong Java Thread
- **
public final void join()
:**Phương thứcjoin()
này trong Java khiến luồng hiện tại phải chờ cho đến khi luồng mà nó gọi join()được gọi lên kết thúc. Nếu luồng bị ngắt trong quá trình chờ, nó sẽ ném ra ngoại lệInterruptedException
. public final synchronized void join(long millis)
: Phương thứcjoin(long millis)
được dùng để yêu cầu luồng hiện tại chờ cho đến khi luồng được gọi kết thúc hoặc hết thời gian chờ đã chỉ định tính bằng mili-giây. Tuy nhiên, do việc thực thi luồng phụ thuộc vào cách hệ điều hành triển khai, nên không có gì đảm bảo rằng luồng hiện tại sẽ chỉ chờ đúng khoảng thời gian đã chỉ định.public final synchronized void join(long millis, int nanos)
: Phương thứcjoin(long millis, int nanos)
cho phép luồng hiện tại chờ đến khi luồng mục tiêu kết thúc hoặc sau khoảng thời gian tính bằng mili-giây cộng với nano-giây đã chỉ định.
Dưới đây là một ví dụ đơn giản minh họa cách sử dụng các phương thức Thread.join
. Mục tiêu của chương trình là đảm bảo luồng main
là luồng kết thúc sau cùng, và luồng thứ ba chỉ bắt đầu khi luồng đầu tiên đã kết thúc.
package com.journaldev.threads;
public class ThreadJoinExample {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable(), "t1");
Thread t2 = new Thread(new MyRunnable(), "t2");
Thread t3 = new Thread(new MyRunnable(), "t3");
t1.start();
//start second thread after waiting for 2 seconds or if it's dead
try {
t1.join(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
//start third thread only when first thread is dead
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
t3.start();
//let all threads finish execution before finishing main thread
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("All threads are dead, exiting main thread");
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("Thread started:::"+Thread.currentThread().getName());
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread ended:::"+Thread.currentThread().getName());
}
}
Kết quả đầu ra của chương trình trên là:
Thread started:::t1
Thread started:::t2
Thread ended:::t1
Thread started:::t3
Thread ended:::t2
Thread ended:::t3
All threads are dead, exiting main thread
Đó là tất cả phần tóm lược nhanh về ví dụ sử dụng phương thức join trong Java thread.