java多线程join()方法的作用和实现原理解析
作用
在Java多线程编程中,有时候需要等待一个线程完成后再去执行其他任务。这时候就需要用到join()方法。join()方法会阻塞当前线程,等待被调用线程执行完成后再继续执行。
实现原理
当调用join()方法时,调用线程会进入等待状态,等待被调用线程执行完成。在Thread的join()方法内部,会调用线程对象的wait()方法,将调用线程放入等待队列中。被调用线程执行完成后,会调用自己的notifyAll()方法,唤醒等待队列中的所有线程,使调用线程恢复运行。
应用场景
示例一:
假设我们在主线程中创建了两个子线程t1和t2,t2需要等待t1执行完成后才能执行。这时候我们可以使用join()方法来实现:
public class MainThread {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程t1开始执行");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程t1执行完成");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程t2开始执行");
try {
// 调用t1的join方法,等待t1执行完成后再继续执行
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程t2执行完成");
}
});
t1.start();
t2.start();
}
}
执行结果:
线程t1开始执行
线程t2开始执行
线程t1执行完成
线程t2执行完成
可以看到,t2会等待t1执行完成后再执行。如果不使用join()方法的话,t1和t2将会同时执行。
示例二:
假设我们需要同时下载多个文件,但是又不想让每个下载任务都卡着等待其他任务完成后再继续执行。这时候我们可以使用join()方法来分阶段下载文件:
public class DownloadTask implements Runnable {
private String url;
private String fileName;
public DownloadTask(String url, String fileName) {
this.url = url;
this.fileName = fileName;
}
@Override
public void run() {
System.out.println("开始下载文件:" + fileName);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("文件下载完成:" + fileName);
}
public static void main(String[] args) throws InterruptedException {
DownloadTask task1 = new DownloadTask("https://example.com/1.pdf", "1.pdf");
DownloadTask task2 = new DownloadTask("https://example.com/2.pdf", "2.pdf");
DownloadTask task3 = new DownloadTask("https://example.com/3.pdf", "3.pdf");
Thread t1 = new Thread(task1);
Thread t2 = new Thread(task2);
Thread t3 = new Thread(task3);
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println("所有文件下载完成");
}
}
执行结果:
开始下载文件:1.pdf
开始下载文件:2.pdf
开始下载文件:3.pdf
文件下载完成:3.pdf
文件下载完成:1.pdf
文件下载完成:2.pdf
所有文件下载完成
以上代码中,我们创建了三个下载任务,并用三个线程来分别执行这三个任务。我们使用join()方法来阻塞主线程,直到所有任务均执行完成后再继续执行主线程。这样就可以保证每个下载任务都能够在自己的线程中执行,而不会相互干扰。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多线程join()方法的作用和实现原理解析(应用场景) - Python技术站