- 浏览: 271863 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
fei33423:
其实查看源代码你可以发现 update其实是调用了execut ...
JdbcTemplate 中execute和update的区别: -
CoderDream:
不错,感谢分享!
为绿色版NOTEPAD++添加右键菜单 -
t382159355:
谢谢分享..感激不尽.
java中this用法 -
風一樣的男子:
kankan1218 写道風一樣的男子 写道出乎意料??
菜B ...
结果出乎大部分人的意料 -
feipigzi:
引用java教程中的一段话:我们可以这样理解子类创建的对象:1 ...
结果出乎大部分人的意料
方法Join 是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答。
自从接触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. 大家能理解吗? 字面意思是等待一段时间直到这个线程死亡,我的疑问是那个线程,是它本身的线程还是调用它的线程的,上代码:
package
concurrentstudy;
/**
*
*
@author
vma
*/
public
class
JoinTest {
public
static
void
main(String[] args) {
Thread t =
new
Thread(
new
RunnableImpl());
t.start();
try
{
t.join(1000)
;
//
主线程只等1
秒,不管子线程什么时候结束
System.out.println("joinFinish");
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class
RunnableImpl
implements
Runnable {
@Override
public
void
run() {
try
{
System.out.println("Begin sleep");
Thread.sleep(1000);
System.out.println("End sleep");
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
结果是:
Begin sleep
End sleep
joinFinish
明白了吧,
当main
线程调用t.join
时,main
线程等待t
线程
,等待时间是1000
,如果t
线程Sleep 2000
呢
public
void
run() {
try
{
System.out.println("Begin sleep");
// Thread.sleep(1000);
Thread.sleep(2000)
;
System.out.println("End sleep");
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
结果是:
Begin sleep
joinFinish
End sleep
也就是说
main
线程只等1000
毫秒,不管T
什么时候结束
,如果是t.join()
呢, 看代码:
public final void join() throws InterruptedException
{
join(0);
}
就是说如果是t.join() = t.join(0)
JDK
这样说的 A timeout of
0
means to wait
forever
字面意思是永远等待,是这样吗?
其实是等到t
结束后。
这个是怎么实现的吗? 看JDK
代码:
/**
* Waits at most <code>millis</code> milliseconds for this thread to
* die. A timeout of <code>0</code> means to wait forever.
*
*
@param
millis the time to wait in milliseconds.
*
@exception
InterruptedException if any thread has interrupted
* the current thread. The <i>interrupted status</i> of the
* current thread is cleared when this exception is thrown.
*/
public
final
synchronized
void
join(
long
millis)
throws
InterruptedException {
long
base = System.currentTimeMillis();
long
now = 0;
if
(millis < 0) {
throw
new
IllegalArgumentException("timeout value is negative");
}
if
(millis == 0) {
while
(isAlive()) {
wait(0);
}
}
else
{
while
(isAlive()) {
long
delay = millis - now;
if
(delay <= 0) {
break
;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
其实Join
方法实现是通过wait
(小提示:Object
提供的方法)。
当main
线程调用t.join
时候,main
线程会获得线程对象t
的锁
(wait
意味着拿到该对象的锁),
调用该对象的wait(
等待时间)
,直到该对象唤醒main
线程,比如退出后。
这就意味着main
线程调用t.join
时,必须能够拿到线程t
对象的锁
,如果拿不到它是无法wait
的,刚开的例子t.join(1000)
不是说明了main
线程等待1
秒,如果在它等待之前,其他线程获取了t
对象的锁,它等待时间可不就是1
毫秒了。上代码介绍:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package
concurrentstudy;
/**
*
*
@author
vma
*/
public
class
JoinTest {
public
static
void
main(String[] args) {
Thread t =
new
Thread(
new
RunnableImpl());
new
ThreadTest(t).start();//
这个线程会持有锁
t.start();
try
{
t.join();
System.out.println("joinFinish");
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class
ThreadTest
extends
Thread {
Thread thread;
public
ThreadTest(Thread thread) {
this
.thread = thread;
}
@Override
public
void
run() {
holdThreadLock();
}
public
void
holdThreadLock() {
synchronized
(thread) {
System.out.println("getObjectLock");
try
{
Thread.sleep(9000);
}
catch
(InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("ReleaseObjectLock");
}
}
}
class
RunnableImpl
implements
Runnable {
@Override
public
void
run() {
try
{
System.out.println("Begin sleep");
Thread.sleep(2000);
System.out.println("End sleep");
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
在main
方法中
通过new
ThreadTest(t).start();
实例化ThreadTest
线程对象, 它在
holdThreadLock()
方法中,通过
synchronized
(thread)
,获取线程对象t
的锁,并Sleep
(9000
)后释放,这就意味着,即使
main
方法t.join(1000),
等待一秒钟,它必须等待
ThreadTest
线程释放t
锁后才能进入wait
方法中,它实际等待时间是9000+1000 MS
运行结果是:
getObjectLock
Begin sleep
End sleep
ReleaseObjectLock
joinFinish
发表评论
-
java关键字transient 和 volatile
2011-04-28 17:36 760翻译自http: // www.devx.com/tips ... -
ava.util.Arrays和java.util.Collections
2011-04-20 22:51 942首先要知道两个类:java.util.Arrays和java. ... -
对象排序之Comparator,Comparable接口区别(华为面试题):
2011-04-20 22:45 1823给了个类,要求编写一段代码,给以下类型的数据排序(按index ... -
wait和sleep区别
2011-04-17 18:46 1547wait和sleep区别: wait是Object类里面 ... -
线程的7种状态及相互转换(图)
2011-04-17 18:35 1519解释: 1、线程的实现有两种方式,一是继承Thr ... -
生产者消费者问题
2011-04-17 18:16 8461) 只要缓冲区有存储单元,生产者都可往其中存放信息;当缓冲 ... -
synchronized用到不同地方对代码产生的影响:
2011-04-14 17:45 950synchronized 用到不同地方对代码产生的影 ... -
HashMap和Hashtable的区别
2011-04-12 16:01 1491转载自: http://oznyang.iteye.co ... -
结果出乎大部分人的意料
2011-04-10 17:44 1283package j2se.test; class A ... -
ClassLoader加载机制
2011-03-24 22:30 1260JVM在运行时会产生三个ClassLoader 1.Bo ... -
java中this用法
2010-12-21 22:45 11671、我们想通过构造方法将外部传入的参数赋值给类的成员变量,构造 ... -
什么是java序列化,如何实现java序列化?(写一个实例)
2010-08-10 10:24 1694序列化: 可以将一个对象保存到一个文件,所以可以通过流的方式 ... -
字符串和字符串池“==”和“equals()”
2010-04-26 13:17 823上次面试题考到一道String字符串比较的,虽然对String ... -
java日期处理
2010-04-23 13:10 9211.怎样获取系统当前日期和时间: java.lang.Sy ... -
java到底是传值还是传引用?
2010-03-26 15:01 1158java传值还是传引用。 JAVA中的传递都是值传递吗?有没有 ... -
Collection 和 Collections;Array与Arrays的区别;Array与ArrayList
2010-03-24 16:58 3723Collection 和 Collections的区别: C ... -
J2SE笔记
2010-03-22 15:39 7591.Image是一个容器,用于装载图画 Graphics是 ... -
深入理解ArrayList与LinkedList的区别
2010-03-21 22:29 1754一、先来看看ArrayList与L ...
相关推荐
主要介绍了JAVA多线程之方法 JOIN详解及实例代码的相关资料,需要的朋友可以参考下
本文对java Thread中join()方法进行介绍,join()的作用是让“主线程”等待“子线程”结束之后才能继续运行,大家参考使用吧
Mysql之innerjoin,leftjoin,rightjoin详解.pdf
6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 239 第7章 web应用程序的部署 240 7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet...
6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 239 第7章 web应用程序的部署 240 7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet...
主要介绍了java 中Thread.join()的使用方法的相关资料,需要的朋友可以参考下
6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 239 第7章 web应用程序的部署 240 7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet...
本压缩包,总共包含两个文档,JAVA多线程编程详解-详细操作例子和 Java多线 程编程总结 例如,runnable、thread、stop()、 suspend、yield、setPriority()、getPriority()、synchronized、wait()、join、线程池同步...
上图中java定义个一个回调接口ActionListener,通过该接口来指定监听之后按钮的行为并添加相应操作。先看图一咯,一般我们监听一个按钮是用匿名内部类的形式,而不会专门去创建一个implement ActionListener的类,...
6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 239 第7章 web应用程序的部署 240 7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种运行方式 244 7.4 与servlet...
用途:帮助读者了解MySQL中的JOIN操作,掌握LEFT JOIN、ON条件过滤和笛卡尔积的使用方法,从而在实际开发中灵活运用JOIN操作实现表关联查询。本文还提供了扩展内容,如排名等应用场景,帮助读者进一步理解JOIN操作的...
主要介绍了Java线程编程中isAlive()和join()的使用详解,是Java入门学习中的基础知识,需要的朋友可以参考下
第1章 Java应用分层架构及软件模型 1.1 应用程序的分层体系结构 1.1.1 区分物理层和逻辑层 1.1.2 软件层的特征 1.1.3 软件分层的优点 1.1.4 软件分层的缺点 1.1.5 Java应用的持久化层 1.2 软件的模型 ...
本篇文章给大家带来的内容是关于java中List集合及其实现类的方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。下面我们就来学习一下吧
接着,深入讲解了Java并发编程的核心API,如synchronized关键字、Lock接口、Condition接口、Semaphore等,帮助读者掌握Java并发编程的基本工具和方法。 除了基础知识和API的讲解,本书还重点介绍了Java并发编程的...
Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务的执行结果得到这个大任务的最终结果。 这种机制策略在分布式数据库中非常常见,数据分布在不同的数据库的...
5.2 方法详解 116 5.2.1 方法的所属性 116 5.2.2 方法的参数传递机制 116 5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? ...
文章目录1、进程与线程2、创建多线程2.1、继承Thread类2.2、实现Runnable接口2.3、使用匿名内部类实现2.4、实现Runnable接口的好处2.5、使用Callable和Future创建线程3、线程的生命周期4、几种特殊线程4.1、join线程...