- 浏览: 276712 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
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 806翻译自http: // www.devx.com/tips ... -
ava.util.Arrays和java.util.Collections
2011-04-20 22:51 981首先要知道两个类:java.util.Arrays和java. ... -
对象排序之Comparator,Comparable接口区别(华为面试题):
2011-04-20 22:45 1855给了个类,要求编写一段代码,给以下类型的数据排序(按index ... -
wait和sleep区别
2011-04-17 18:46 1588wait和sleep区别: wait是Object类里面 ... -
线程的7种状态及相互转换(图)
2011-04-17 18:35 1553解释: 1、线程的实现有两种方式,一是继承Thr ... -
生产者消费者问题
2011-04-17 18:16 8821) 只要缓冲区有存储单元,生产者都可往其中存放信息;当缓冲 ... -
synchronized用到不同地方对代码产生的影响:
2011-04-14 17:45 982synchronized 用到不同地方对代码产生的影 ... -
HashMap和Hashtable的区别
2011-04-12 16:01 1528转载自: http://oznyang.iteye.co ... -
结果出乎大部分人的意料
2011-04-10 17:44 1351package j2se.test; class A ... -
ClassLoader加载机制
2011-03-24 22:30 1293JVM在运行时会产生三个ClassLoader 1.Bo ... -
java中this用法
2010-12-21 22:45 12151、我们想通过构造方法将外部传入的参数赋值给类的成员变量,构造 ... -
什么是java序列化,如何实现java序列化?(写一个实例)
2010-08-10 10:24 1730序列化: 可以将一个对象保存到一个文件,所以可以通过流的方式 ... -
字符串和字符串池“==”和“equals()”
2010-04-26 13:17 855上次面试题考到一道String字符串比较的,虽然对String ... -
java日期处理
2010-04-23 13:10 9511.怎样获取系统当前日期和时间: java.lang.Sy ... -
java到底是传值还是传引用?
2010-03-26 15:01 1198java传值还是传引用。 JAVA中的传递都是值传递吗?有没有 ... -
Collection 和 Collections;Array与Arrays的区别;Array与ArrayList
2010-03-24 16:58 3771Collection 和 Collections的区别: C ... -
J2SE笔记
2010-03-22 15:39 7921.Image是一个容器,用于装载图画 Graphics是 ... -
深入理解ArrayList与LinkedList的区别
2010-03-21 22:29 1794一、先来看看ArrayList与L ...
相关推荐
【Java多线程教程】- join方法深度解析 在Java多线程编程中,`join()`方法是一个关键的同步工具,它允许一个线程(通常为主线程)等待另一个线程(子线程)执行完毕后再继续执行。本文将详细探讨`join()`方法的原理...
以上是对"Java多线程详解"主题的详细阐述,涵盖了Java多线程的基本概念、实现方式、线程控制、线程池、并发集合、线程间通信以及并发编程中常见的问题和解决方案。学习和熟练掌握这些内容对于开发高效的多线程Java...
Java中的`join()`方法是多线程编程中的一个重要特性,用于控制线程间的协作和同步。在Java中,多线程允许程序同时执行多个任务,但有时我们需要确保某些线程按照特定顺序完成,或者主线程需要等待其他线程执行完毕后...
Java多线程join方法实例代码 ...* Java多线程join方法详解:https://www.cnblogs.com/itech/archive/2012/07/20/2598162.html * Java多线程编程基础:https://www.runoob.com/java/java-multithreading.html
在本Java案例详解1精通Java项目开发中,我们将深入探讨如何使用Java技术构建高效、稳定的企业信息系统。这个案例主要基于Java编程语言,并结合SQL2000数据库管理系统,利用MyEclipse开发工具来实现。以下将详细介绍...
Mysql 之 inner join、left join、right join 详解 Mysql 中的连接查询是指从多个表中检索数据,并将它们组合成一个结果集。inner join、left join 和 right join 是 Mysql 中三种最常用的连接查询方式。 inner ...
本文将围绕"基于Solr的多表join查询加速方法"这一主题,深入探讨如何在Solr中实现类似join的功能,并优化查询性能。 在Solr中模拟join操作通常有两种策略:嵌入式数据模型和外部数据源查询(ExternalFileField或...
Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...
Java的`Thread`类提供了控制线程的方法,如`start()`启动线程,`join()`等待线程结束,`sleep()`使线程暂停执行等。 3. **线程同步** 在多线程环境中,数据共享可能导致数据不一致,为了解决这个问题,Java提供了...
Java 线程详解 在 Java 编程语言中,线程是一种基本的编程单元,它允许开发者在一个程序中执行多个任务。线程是轻量级的进程,它可以与其他线程共享同一个进程的资源。线程的使用可以提高程序的效率和响应速度。 ...
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...
`fork()`方法用于启动子任务,`join()`方法用于等待子任务完成并获取结果。 ```java public class ForkJoinSumCalculator extends RecursiveTask<Long> { // ... @Override protected Long compute() { // ... ...
Java实现搜索功能代码详解 Java实现搜索功能代码详解是一篇详细介绍了Java实现搜索功能代码的文章,主要讲解了如何使用Java语言实现搜索功能的详细思路和代码实现。下面我们将详细介绍其中的知识点。 搜索框的GET...
在Java编程语言中,`Thread.join()`方法是一个非常重要的同步工具,它允许一个线程(调用者)等待另一个线程(被调用者)执行完成。`Thread.join()`的使用能够有效地解决多线程环境中的顺序执行问题,确保线程间的...
这些状态之间的转换由JVM和线程的执行情况决定,如join()方法可以使当前线程等待目标线程结束,wait()和sleep()方法可以使线程进入等待或阻塞状态。 Java提供了多种线程同步机制,以防止数据竞争和死锁的发生。...
【Java多线程详解】 Java 多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高系统的效率和响应性。在Java中,多线程的实现主要有两种方式:继承`Thread`类和实现`Runnable`接口。 1. 继承`...
join()方法允许一个线程等待另一个线程完成。这样可以确保线程按照一定的顺序执行,防止数据竞争。 7. sleep()和yield() sleep()方法让当前线程暂停指定的时间,然后恢复执行。yield()方法则让当前线程放弃CPU...
Java线程之join方法详解 Java线程之join方法是Java中的一种线程同步机制,它允许一个线程等待另一个线程的完成。join方法定义在Thread.java中,通过源码分享join方法,需要的朋友可以参考以下内容。 join方法的...