`
heqing
  • 浏览: 22005 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java线程join()方法的用处

阅读更多
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。
分享到:
评论
1 楼 robin35java 2011-03-03  
讲的很清楚,学习了

相关推荐

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意...

    Java线程 高级使用

    通过以上内容的学习,读者可以深入了解Java线程的高级使用方法,掌握如何在Java程序中高效地管理和控制线程,以及如何解决多线程环境下常见的问题。这对于开发高性能、高可用性的Java应用至关重要。

    java线程基础讲解

    ### Java线程基础详解 #### 一、线程概述 **1.1 什么是线程?** 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。在Java中,线程是程序执行流的最小单元,一个标准的...

    java多线程

    本文旨在深入探讨`join()`方法的原理、用途及其实现机制,帮助Java开发者更熟练地掌握这一核心概念,以解决实际开发中的多线程问题。 #### `join()`方法概述 `join()`方法位于`Thread`类中,其主要功能是在当前...

    Java线程状态及切换、关闭线程的正确姿势分享

    "Java线程状态及切换、关闭线程的正确姿势分享" 本文将详细介绍Java线程状态及切换、关闭线程的相关内容。线程状态及切换是Java多线程编程中一个非常重要的概念,掌握线程状态及切换是编写高效、稳定、可靠的多线程...

    Java应用开发多线程

    通常,多线程在GUI应用中的用途是将耗时的操作(如网络通信或数据库查询)放在后台线程,以免阻塞用户界面。 在`JFrameThread.java`中,可能包括以下内容: - 创建`JFrame`对象,构建GUI界面。 - 使用`...

    线程方法操作

    1. **线程定义与用途** 线程是操作系统分配CPU时间的基本单位,一个进程中可以有多个线程。它们共享同一内存空间,但各自拥有独立的程序计数器、栈和局部变量。多线程主要用在需要同时执行多个任务的场景,如网络...

    92道Java多线程与并发面试题含答案(很全)

    线程间通信可以通过`wait()`、`notify()`、`notifyAll()`、`Thread.join()`等方法实现。线程池通过`ExecutorService`、`ThreadPoolExecutor`等类管理线程资源,提高系统性能。原子操作如`AtomicInteger`、`...

    JAVA多线程技术分享-39页PPT(winding)

    `join`方法让一个线程等待另一个线程结束;`CountDownLatch`是并发工具类,常用于同步多个线程的开始或结束。 在项目应用中,线程池技术如`ExecutorService`能够有效地管理和控制线程,避免过度创建销毁线程,提升...

    JAVA高质量并发详解,多线程并发深入讲解

    - **线程基本概念:** Java线程是程序执行流的最小单元,一个线程包含一个程序计数器(PC)、虚拟机栈、本地方法栈、线程私有的工作内存。 - **线程生命周期:** 包括`NEW`、`RUNNABLE`、`BLOCKED`、`WAITING`、`...

    15个顶级Java多线程面试题及回答.docx

    **解答:** 在Java中可以通过`Thread.join()`方法来实现线程之间的顺序执行。例如,如果希望T2在线程T1执行完毕之后执行,可以在T2启动之前调用`T1.join()`。同样的逻辑适用于T3,即在T3启动前调用`T2.join()`。 ```...

    高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别.pdf,这是一份不错的文件

    本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要组成部分。下面是对每个方法的详细讲解: 1. sleep()方法: sleep()方法是Thread类...

    Introduction to Java Threads

    ### Java线程介绍 #### 关于本教程 本教程旨在为Java程序员提供关于线程的基础知识,包括线程的概念、用途以及如何编写简单的多线程程序。此外,本教程还会探讨更复杂的线程应用程序的基本构建模块,如在不同线程...

    java面试宝典2010版

    - **知识点**: Java线程有不同的生命周期状态。 - **解释**: 线程的状态包括新建(`NEW`)、就绪(`RUNNABLE`)、阻塞(`BLOCKED`)、等待(`WAITING`)、定时等待(`TIMED_WAITING`)和终止(`TERMINATED`)。 #### 39. `sleep...

    java面试宝典,包含java基础篇、多线程、spring、springboot、mysql、redis、mq等等经典面试问题

    这份资源包含了Java基础、多线程、Spring框架、Spring Boot、MySQL数据库、Redis缓存以及消息队列MQ等多个核心知识点,每个部分都涵盖了经典且常见的面试问题。 1. **Java基础篇**: - 内存模型:了解JVM内存结构...

    Java函数速查

    它涵盖了Java语言中各种核心类库、API及常用函数的使用方法,旨在帮助开发者快速查找和理解函数的用途、参数及返回值,提高编程效率。以下是对Java函数的一些主要知识点的详细说明: 1. **基础类型与包装类** - ...

    Java高级工程师面试.pdf

    此外,对于线程间的通信机制,如`wait()`、`notify()`、`join()`、`yield()`等方法也是面试中经常问到的。 Java高级开发工程师还需要掌握JVM原理,包括JVM内存模型、垃圾回收机制,以及性能调优的方法。对于常用的...

    Java API帮助文档中文版1.8版和官方中文1.6版

    在多线程方面,Java 8改进了Fork/Join框架,使得并行计算更加容易。CompletableFuture类允许异步编程和组合异步操作,极大地提高了并发编程的灵活性。此外,Nashorn JavaScript引擎的加入使得Java可以无缝地与...

    Java编程思想练习题答案

    7. **多线程**:Java提供了内置的多线程支持,理解线程的创建、同步和通信,如synchronized关键字、wait()、notify()和join()方法,是解决并发问题的基础。 8. **反射**:Java反射机制允许程序在运行时动态地获取类...

Global site tag (gtag.js) - Google Analytics