对于JAVA的join,JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever。字面意思是等待一段时间直到这个线程死亡。
有这样一种应用场景,主线程启动几个子线程分别同时去作一些事情,主线程需等这些子线程都结束后,才能往下执行(如需要获得子线程的结果信息)
面对这样的场景,我们有几种思路:
1.启动子线程后,让主线程sleep一段时间
这种方式最不靠谱,因为我们不知道要让主线程休眠多长时间
实例1:
package com.bijian.study.thread; public class MyThread extends Thread { boolean negative = true; double pi; // Initializes to 0.0, by default public void run() { for (int i = 3; i < 100000; i += 2) { if (negative) pi -= (1.0 / i); else pi += (1.0 / i); negative = !negative; } pi += 1.0; pi *= 4.0; System.out.println("Finished calculating PI"); } }
主线程:
package com.bijian.study.thread; public class MainThread { public static void main(String[] args) { MyThread mt = new MyThread(); mt.start(); try { Thread.sleep(10); // Sleep for 10 milliseconds } catch (InterruptedException e) { } System.out.println("pi = " + mt.pi); } }
运行结果:
Finished calculating PI pi = 3.1415726535897894
2.sleep一段时间不靠谱,于是还可以来个循环,判断子线程是否还活着
实例2(修改实例1的主线程):
package com.bijian.study.thread; public class MainThread2 { public static void main(String[] args) { MyThread mt = new MyThread(); mt.start(); while (mt.isAlive()) try { Thread.sleep(10); // Sleep for 10 milliseconds } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("pi = " + mt.pi); } }
运行结果:
Finished calculating PI pi = 3.1415726535897894
这样,效果是达到了,但在主线程里写个循环,不是高性能的方法。
3.join很好的解决此应用场景
实例3(修改实例1的主线程):
package com.bijian.study.thread; public class MainThread3 { public static void main(String[] args) { MyThread mt = new MyThread(); mt.start(); try { mt.join(); } catch (InterruptedException e) { } System.out.println("pi = " + mt.pi); } }
运行结果:
Finished calculating PI pi = 3.1415726535897894
扩展下实例3,就能很好的解决主线程启动几个子线程分别同时去作一些事情,主线程需等这些子线程都结束后,才能往下执行。如下所示:
实例4:
1.新建一个子线程
package com.bijian.study.thread; public class MyThread2 extends Thread { boolean negative = true; double res; // Initializes to 0.0, by default public void run() { for (int i = 1; i < 100; i += 2) { if (negative) res -= (1.0 / i); else res += (1.0 / i); negative = !negative; } System.out.println("Finished calculating res"); } }
2.修改实例1的主线程
package com.bijian.study.thread; public class MainThread3 { public static void main(String[] args) { //创建并启动子线程1 MyThread mt = new MyThread(); mt.start(); //创建并启动子线程2 MyThread2 mt2 = new MyThread2(); mt2.start(); try { mt.join(); mt2.join(); } catch (InterruptedException e) { } System.out.println("pi = " + mt.pi); System.out.println("res = " + mt2.res); } }
运行结果:
Finished calculating res Finished calculating PI pi = 3.1415726535897894 res = -0.7803986631477527
相关推荐
总之,掌握Java多线程的生命周期、创建、启动、同步以及线程池的使用是编写高效、稳定并发程序的基础。理解这些知识点对于解决并发编程中的问题,比如资源竞争、死锁、线程安全性等问题,至关重要。在实际开发中,...
通过分析并实践`threadTest`案例,我们可以深入理解Java多线程的原理和使用技巧,为编写高效并发程序打下坚实基础。同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
在Java编程中,多线程的使用是实现程序并发运行的重要手段。本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、...
在本文中,我们将深入浅出Java多线程编程的世界,探索多线程编程的基本概念、多线程编程的优点、多线程编程的缺点、多线程编程的应用场景、多线程编程的实现方法等内容。 一、多线程编程的基本概念 多线程编程是指...
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...
总之,Java多线程和异步调用是构建高效、响应迅速的应用程序的关键技术。通过合理利用这些工具和机制,开发者可以编写出能够充分利用多核处理器优势的代码,从而提高软件性能。在实际应用中,理解并熟练掌握这些概念...
在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。
Java多线程是Java编程中的核心概念,尤其对于高级开发者来说,掌握多线程的深入理解和应用至关重要。这本书“java多线程进阶”显然旨在帮助读者深化这方面的理解,打通编程中的“任督二脉”,使开发者能够更加熟练地...
Java多线程下载技术是Java开发中用于提升大文件下载效率的一种常见方法。在传统的单线程下载过程中,网络请求可能会因为各种原因中断,如网络波动、服务器问题或用户操作等,这会导致需要从头开始下载,浪费时间和...
这篇资料深入探讨了Java多线程的相关知识,包括线程的创建、同步与通信、线程的状态管理等。 1. **线程创建** - 继承Thread类:创建一个新类,该类继承自Thread类,并重写run()方法,然后创建该类的实例并调用...
Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用...
总之,Java多线程技术是开发高并发应用程序的基础,熟练掌握线程的创建、同步、通信以及并发工具的使用,对于提升程序性能和解决复杂问题具有重要意义。这个"java多线程小汽车运行程序"为学习和实践这些概念提供了一...
总之,“Java多线程编程指南”将涵盖这些核心概念,并可能深入到高级话题,如线程池的优化、并发容器的使用以及并发编程的最佳实践,帮助读者提升在多线程环境下的编程能力。通过深入学习和实践,开发者能够构建出...
Java多线程是Java编程中的核心概念,尤其在开发高性能、高并发的应用时,多线程技术显得尤为重要。本系列视频教程将深入讲解Java多线程的各个方面,帮助你掌握如何在Java环境中创建、管理以及优化多线程程序。 首先...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个...这个项目不仅展示了Java多线程的基本用法,还涉及到线程同步、GUI更新以及线程生命周期管理等高级主题,对于学习和理解Java并发编程有很好的实践意义。
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了应用程序的效率和响应速度。在Java中,多线程的实现主要有两种方式:继承Thread类和实现Runnable接口。 一、继承Thread类 当一个类直接继承...
Java多线程是Java编程中的重要组成部分,尤其在并发编程领域,它扮演着核心角色。在实际项目中,多线程被广泛应用于提高系统效率、实现任务并行处理,以及优化资源利用。以下是对"java多线程测试实例"的详细解析: ...