- 浏览: 55217 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
jelver:
正需要这种模式的开发资料,谢谢
【1】搭建GAE+GWT+Spring3环境 -
neilone.cn:
兄弟,我始终出现这个错误
The resource nam ...
【2】GAE+Sping中JDO的配置 -
snowtigersoft:
linzy410 写道所以方法一两次进入HashMap的Ent ...
谈谈遍历Map内容效率问题 -
linzy410:
所以方法一两次进入HashMap的Entry中, 而方法二取得 ...
谈谈遍历Map内容效率问题 -
linzy410:
写一个简单的测试就会发现,方法一比方法二的效率高了接近1倍所以 ...
谈谈遍历Map内容效率问题
一、 在研究 join 的用法之前,先明确 两件 事情 。
1.j oin 方法定 义 在 Thread 类 中, 则调 用者必 须 是一个 线 程,
例如:
Thread t = new Custom Thread(); // 这里一般是自定义的线程类
t .start();// 线程起动
t.join();// 此处 会 抛出 InterruptedException 异常
2. 上面的两行代码也是在一个线程里面执行的。
以上出现了两个线程,一个是我们自定义的线程类,我们实现了 run 方法,做一些我们需要的工作;另外一个线程,生成我们自定义线程类的对象,然后执行
custom Thread .start();
custom Thread .join();
在这种情况下,两个线程的关系是一个线程由另外一个线程生成并起动,所以我们暂且认为第一个线程叫做“子线程 ”,另外一个线程叫做“主线程 ”。
二、为什么要用 join() 方法
主线程生成并起动了子线程,而子线程里要进行大量的耗时的运算 ( 这里可以借鉴下线程的作用 ) ,当主线程处理完其他的事务后,需要用到子线程的处理结果,这个时候就要用到 join(); 方法了。
三、 join 方法的作用
在网上看到有人说“将两个线程合并”。这样解释我觉得理解起来还更麻烦。不如就借鉴下 API 里的说法:
“等待该线程终止。”
解释一下,是主线程 ( 我在“一”里已经命名过了 ) 等待子线程的终止。也就是在子线程调用了 join() 方法后面的代码,只有等到子线程结束了才能执行。(Waits for this thread to die.)
四、用实例来理解
写一个简单的例子来看一下 join() 的用法,一共三个类:
1.CustomThread 类
2. CustomThread1 类
3. JoinTestDemo 类, main 方法所在的类。
代码 1 :
打印结果:
main start. //main 方法所在的线程起动,但没有马上结束,因为调用 t.join(); ,所以要等到 t 结束了,此线程才能向下执行。
[CustomThread1] Thread start. // 线程 CustomThread1 起动
[CustomThread1] Thread loop at 0 // 线程 CustomThread1 执行
[CustomThread1] Thread loop at 1 // 线程 CustomThread1 执行
[CustomThread] Thread start. // 线程 CustomThread 起动,但没有马上结束,因为调用 t1.join(); ,所以要等到 t1 结束了,此线程才能向下执行。
[CustomThread1] Thread loop at 2 // 线程 CustomThread1 继续执行
[CustomThread1] Thread loop at 3 // 线程 CustomThread1 继续执行
[CustomThread1] Thread loop at 4 // 线程 CustomThread1 继续执行
[CustomThread1] Thread end. // 线程 CustomThread1 结束了
[CustomThread] Thread end. // 线程 CustomThread 在 t1.join(); 阻塞处起动,向下继续执行的结果
main end! // 线程 CustomThread 结束,此线程在 t.join(); 阻塞处起动,向下继续执行的结果。
修改一下代码,得到代码 2 :(这里只写出修改的部分)
打印结果:
main start. // main 方法所在的线程起动,但没有马上结束,这里并不是因为 join 方法,而是因为 Thread.sleep(2000);
[CustomThread1] Thread start. // 线程 CustomThread1 起动
[CustomThread1] Thread loop at 0 // 线程 CustomThread1 执行
[CustomThread1] Thread loop at 1 // 线程 CustomThread1 执行
main end! // Thread.sleep(2000); 结束,虽然在线程 CustomThread 执行了 t1.join(); ,但这并不会影响到其他线程 ( 这里 main 方法所在的线程 ) 。
[CustomThread] Thread start. // 线程 CustomThread 起动,但没有马上结束,因为调用 t1.join(); ,所以要等到 t1 结束了,此线程才能向下执行。
[CustomThread1] Thread loop at 2 // 线程 CustomThread1 继续执行
[CustomThread1] Thread loop at 3 // 线程 CustomThread1 继续执行
[CustomThread1] Thread loop at 4 // 线程 CustomThread1 继续执行
[CustomThread1] Thread end. // 线程 CustomThread1 结束了
[CustomThread] Thread end. // 线程 CustomThread 在 t1.join(); 阻塞处起动,向下继续执行的结果
五、从源码看 join() 方法
在 CustomThread 的 run 方法里,执行了 t1.join(); ,进入看一下它的 JDK 源码:
然后进入 join(0) 方法:
单纯从代码上看,如果线程被生成了,但还未被起动,调用它的 join() 方法是没有作用的。将直接继续向下执行,这里就不写代码验证了。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bzwm/archive/2009/02/12/3881392.aspx
发表评论
-
properties文件中定义大括号
2010-04-01 17:06 3429今天遇到一个很郁闷的问题,使用MessageFormat.ap ... -
谈谈遍历Map内容效率问题
2010-03-11 16:34 3487在开发中经常会遇到对Map中的key和value值对的遍历操作 ... -
使用ant编译时忽略已编译为jar的源码
2009-12-24 17:55 1067今天在使用ant时遇到一个问题,因为代码中的一部分属于公 ... -
Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表
2008-09-22 13:22 656Java数据类型 Hibernate数据类型 标准SQL数 ... -
jsp判断是否登录
2008-10-04 16:01 2271单独写个JSP页面,判断是否为登录用户&l ... -
JSP中文问题解决
2008-10-15 08:33 679一、中文问题的来源 ...
相关推荐
Java多线程的实现主要有两种方式:继承Thread类和实现Runnable接口。继承Thread类是通过创建一个新的类,该类直接或间接地继承自Thread,并重写run()方法。这种方式下,每个线程都有自己的实例,可以直接调用start()...
《浅析多核处理器条件下的Java编程》这篇文章探讨了如何利用Java语言的多线程特性在多核处理器环境下实现高效编程。多核处理器是现代计算机硬件的重要组成部分,它通过集成多个处理器核心,允许同时处理多个任务,...
对于阻塞的线程,比如在调用Thread.sleep()、Thread.join()或Object.wait()时,如果线程被中断,会抛出InterruptedException异常。这个异常会清除中断状态,线程需要捕获这个异常并做出响应,通常意味着中断线程的...
对于阻塞状态的线程,如在执行`object.wait()`, `thread.join()`, 或者`Thread.sleep()`时,如果被中断,这些方法会抛出`InterruptedException`。这是线程中断机制的一个关键特性,因为它允许线程在阻塞状态下被唤醒...
5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6 Condition的使用.mp4 6-1 什么是原子类.mp4 6-2 原子更新基本类型.mp4 6-3 原子更新数组类型.mp4 6-4 原子地更新属性.mp4 6-5 原子更新...
5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6 Condition的使用.mp4 6-1 什么是原子类.mp4 6-2 原子更新基本类型.mp4 6-3 原子更新数组类型.mp4 6-4 原子地更新属性.mp4 6-5 原子更新...
5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6 Condition的使用.mp4 6-1 什么是原子类.mp4 6-2 原子更新基本类型.mp4 6-3 原子更新数组类型.mp4 6-4 原子地更新属性.mp4 6-5 原子更新...
5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6 Condition的使用.mp4 6-1 什么是原子类.mp4 6-2 原子更新基本类型.mp4 6-3 原子更新数组类型.mp4 6-4 原子地更新属性.mp4 6-5 原子更新...
5-4 Thread.join通信及其源码浅析.mp4 5-5 ThreadLocal的使用.mp4 5-6 Condition的使用.mp4 6-1 什么是原子类.mp4 6-2 原子更新基本类型.mp4 6-3 原子更新数组类型.mp4 6-4 原子地更新属性.mp4 6-5 原子更新...
#### 十二、JAVA的多线程浅析 ##### 1. JAVA语言的来源、及特点 - **起源**: - Java最初由Sun Microsystems开发。 - **特点**: - 面向对象。 - 平台无关性。 - 自动垃圾回收。 ##### 2. JAVA的多线程理论 - **...
#### 七、浅析 Java `Thread.join()` - **功能**:使主线程等待所有子线程执行完毕。 - **原理**:调用`join()`方法的线程会等待目标线程结束之后才能继续执行。 #### 八、线程运行中抛出异常的处理 - **捕获异常...