run() 和start() 是大家都很熟悉的两个方法。把希望并行处理的代码都放在run() 中;stat() 用于自动调用run(),这是JAVA的内在机制规定的。并且run() 的访问控制符必须是public,返回值必须是void(这种说法不准确,run() 没有返回值),run()不带参数。
闲话少说,我们要讲的是join(),我们首先来看个例子:
代码:
/** * @author QingHe * Creation on 2005-12-19 */
public class ThreadTest implements Runnable { public static int a = 0;
public void run() { for (int k = 0; k < 5; k++) { a = a + 1; } }
public static void main(String[] args) throws Exception { Runnable r = new ThreadTest(); Thread t = new Thread(r); t.start(); System.out.println(a); } }
|
|
请问程序的输出结果是5吗?答案是:有可能。其实你很难遇到输出5的时候,通常情况下都不是5。当然这也和机器有严重的关系。为什么呢?我的解释是当主线程main方法执行System.out.println(a);这条语句时,线程还没有真正开始运行,或许正在为它分配资源准备运行吧。因为为线程分配资源需要时间,而main方法执行完t.start()方法后继续往下执行System.out.println(a);,这个时候得到的结果是a还没有被改变的值0。怎样才能让输出结果为5!其实很简单,join() 方法提供了这种功能。join() 方法,它能够使调用该方法的线程在此之前执行完毕。
代码:
/** * @author QingHe * Creation on 2005-12-19 */
public class ThreadTest implements Runnable { public static int a = 0;
public void run() { for (int k = 0; k < 5; k++) { a = a + 1; } }
public static void main(String[] args) throws Exception { Runnable r = new ThreadTest(); Thread t = new Thread(r); t.start(); t.join(); System.out.println(a); } }
|
|
这个时候,程序输入结果始终为5。
为了证明如果不使用t.join()方法,主线程main方法的System.out.println(a);语句将抢先执行,我们可以在main方法中加入一个循环,这个循环用来延长main方法执行的时间,循环次数将严重取决于机器性能。如果循环次数得当,我们也可以看到a的输出结果是5。
代码:
/** * @author QingHe * Creation on 2005-12-19 */
public class ThreadTest implements Runnable { public static int a = 0;
public void run() { for (int k=0; k<5; k++) { a = a + 1; } }
public static void main(String[] args) throws Exception { Runnable r = new ThreadTest(); Thread t = new Thread(r); t.start(); for (int i=0; i<300; i++) { /* 注意循环体内一定要有实际执行语句,否则编译器或JVM可能优化掉你的这段代码,视这段代 码为无效。 */ System.out.print(i); } System.out.println(); System.out.println(a); } }
|
|
这时,在我的机器上,a的输出值始终为5。
分享到:
相关推荐
以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意...
通过以上内容的学习,读者可以深入了解Java线程的高级使用方法,掌握如何在Java程序中高效地管理和控制线程,以及如何解决多线程环境下常见的问题。这对于开发高性能、高可用性的Java应用至关重要。
### Java线程基础详解 #### 一、线程概述 **1.1 什么是线程?** 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。在Java中,线程是程序执行流的最小单元,一个标准的...
本文旨在深入探讨`join()`方法的原理、用途及其实现机制,帮助Java开发者更熟练地掌握这一核心概念,以解决实际开发中的多线程问题。 #### `join()`方法概述 `join()`方法位于`Thread`类中,其主要功能是在当前...
"Java线程状态及切换、关闭线程的正确姿势分享" 本文将详细介绍Java线程状态及切换、关闭线程的相关内容。线程状态及切换是Java多线程编程中一个非常重要的概念,掌握线程状态及切换是编写高效、稳定、可靠的多线程...
通常,多线程在GUI应用中的用途是将耗时的操作(如网络通信或数据库查询)放在后台线程,以免阻塞用户界面。 在`JFrameThread.java`中,可能包括以下内容: - 创建`JFrame`对象,构建GUI界面。 - 使用`...
1. **线程定义与用途** 线程是操作系统分配CPU时间的基本单位,一个进程中可以有多个线程。它们共享同一内存空间,但各自拥有独立的程序计数器、栈和局部变量。多线程主要用在需要同时执行多个任务的场景,如网络...
线程间通信可以通过`wait()`、`notify()`、`notifyAll()`、`Thread.join()`等方法实现。线程池通过`ExecutorService`、`ThreadPoolExecutor`等类管理线程资源,提高系统性能。原子操作如`AtomicInteger`、`...
`join`方法让一个线程等待另一个线程结束;`CountDownLatch`是并发工具类,常用于同步多个线程的开始或结束。 在项目应用中,线程池技术如`ExecutorService`能够有效地管理和控制线程,避免过度创建销毁线程,提升...
- **线程基本概念:** Java线程是程序执行流的最小单元,一个线程包含一个程序计数器(PC)、虚拟机栈、本地方法栈、线程私有的工作内存。 - **线程生命周期:** 包括`NEW`、`RUNNABLE`、`BLOCKED`、`WAITING`、`...
**解答:** 在Java中可以通过`Thread.join()`方法来实现线程之间的顺序执行。例如,如果希望T2在线程T1执行完毕之后执行,可以在T2启动之前调用`T1.join()`。同样的逻辑适用于T3,即在T3启动前调用`T2.join()`。 ```...
本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要组成部分。下面是对每个方法的详细讲解: 1. sleep()方法: sleep()方法是Thread类...
### Java线程介绍 #### 关于本教程 本教程旨在为Java程序员提供关于线程的基础知识,包括线程的概念、用途以及如何编写简单的多线程程序。此外,本教程还会探讨更复杂的线程应用程序的基本构建模块,如在不同线程...
- **知识点**: Java线程有不同的生命周期状态。 - **解释**: 线程的状态包括新建(`NEW`)、就绪(`RUNNABLE`)、阻塞(`BLOCKED`)、等待(`WAITING`)、定时等待(`TIMED_WAITING`)和终止(`TERMINATED`)。 #### 39. `sleep...
这份资源包含了Java基础、多线程、Spring框架、Spring Boot、MySQL数据库、Redis缓存以及消息队列MQ等多个核心知识点,每个部分都涵盖了经典且常见的面试问题。 1. **Java基础篇**: - 内存模型:了解JVM内存结构...
它涵盖了Java语言中各种核心类库、API及常用函数的使用方法,旨在帮助开发者快速查找和理解函数的用途、参数及返回值,提高编程效率。以下是对Java函数的一些主要知识点的详细说明: 1. **基础类型与包装类** - ...
此外,对于线程间的通信机制,如`wait()`、`notify()`、`join()`、`yield()`等方法也是面试中经常问到的。 Java高级开发工程师还需要掌握JVM原理,包括JVM内存模型、垃圾回收机制,以及性能调优的方法。对于常用的...
在多线程方面,Java 8改进了Fork/Join框架,使得并行计算更加容易。CompletableFuture类允许异步编程和组合异步操作,极大地提高了并发编程的灵活性。此外,Nashorn JavaScript引擎的加入使得Java可以无缝地与...
7. **多线程**:Java提供了内置的多线程支持,理解线程的创建、同步和通信,如synchronized关键字、wait()、notify()和join()方法,是解决并发问题的基础。 8. **反射**:Java反射机制允许程序在运行时动态地获取类...