join()>>不带参数

线程A调用线程B.join,意思就是线程A并入了线程B,当执行完线程B,再去执行线程A后续动作

join(int keepTims)>>带参数,与上面类似,区别在于线程B保持并入线程A中有保持时间,超过改时间,两线程再次分开

案例1

package com.wp.join;

public class JoinTest implements Runnable {

    public static int a = 0;

    @Override
public void run() {
for(;;){
a++;
System.out.println("变量A="+a);
long now = System.currentTimeMillis();
while (System.currentTimeMillis() - now < 1000) {
}
if(a>8){
break;
}
}
} public static void main(String[] args) {
Thread task = new Thread(new JoinTest());
task.start();
try {
task.join(9000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End var = "+a);
} }

案例2

package com.wp.join;

public class JoinTest2 {

    private static int num = 0;

    static class JoinThreadA extends Thread {

        @Override
public void run() {
while (true) {
num++;
long now = System.currentTimeMillis();
while (System.currentTimeMillis() - now < 200) {
}
System.out.println("选手A已跑" + num + "米");
if (num >= 100) {
break;
}
}
}
} static class JoinThreadB extends Thread {
protected JoinThreadA joina; public JoinThreadB(JoinThreadA joina) {
this.joina = joina;
} @Override
public void run() {
try {
joina.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
num++;
long now = System.currentTimeMillis();
while (System.currentTimeMillis() - now < 100) {
}
System.out.println("选手B已跑" + num + "米");
if (num >= 200) {
break;
}
} }
}
static class JoinThreadC extends Thread {
protected JoinThreadB joinb; public JoinThreadC(JoinThreadB joinb) {
this.joinb = joinb;
} @Override
public void run() {
try {
joinb.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
num++;
long now = System.currentTimeMillis();
while (System.currentTimeMillis() - now < 50) {
}
System.out.println("选手C已跑" + num + "米");
if (num >= 300) {
break;
}
} }
} static class JoinThreadD extends Thread {
protected JoinThreadC joinc; public JoinThreadD(JoinThreadC joinc) {
this.joinc = joinc;
} @Override
public void run() {
try {
joinc.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
num++;
long now = System.currentTimeMillis();
while (System.currentTimeMillis() - now < 20) {
}
System.out.println("选手D已跑" + num + "米");
if (num >= 400) {
break;
}
} }
} public static void main(String[] args) throws Exception {
System.out.println("比赛开始");
JoinThreadA joina = new JoinThreadA();
JoinThreadB joinb = new JoinThreadB(joina);
JoinThreadC joinc = new JoinThreadC(joinb);
JoinThreadD joind = new JoinThreadD(joinc);
joina.start();
joinb.start();
joinc.start();
joind.start();
joind.join();
System.out.println("比赛结束,最终跑完" + num + "米");
} }

案例三

package com.wp.join;

import java.text.SimpleDateFormat;
import java.util.Date; public class JoinTest3 {
final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); static class JoinThread extends Thread {
Thread syncThread; public JoinThread(Thread syncThread) {
this.syncThread = syncThread;
} @Override
public void run() {
synchronized (syncThread) {
System.out.println("线程A START");
long now = System.currentTimeMillis();
while (System.currentTimeMillis() - now < 5000) {
}
System.out.println("线程A END");
}
}
} public static void main(String[] args) {
System.out.println("开始时间:"+format.format(new Date()));
Thread t1 = new Thread(new Runnable() { @Override
public void run() {
System.out.println("Begin sleep");
long now = System.currentTimeMillis();
while (System.currentTimeMillis() - now < 5000) {
}
System.out.println("End sleep"); }
});
Thread t2 = new JoinThread(t1);
t1.start();
t2.start();
try {
t1.join(1000);//因为T1线程对象的锁被T2持有,所以必须等T2跑完,释放锁 所以此处等待的时间 1000+5000
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("结束时间:"+format.format(new Date()));
} }

java-多线程-join函数的更多相关文章

  1. 我也学习JAVA多线程-join

    在工作中,挺少遇到join关键字,但很多多线程资料和面试过程中,初中级开发工程师总会遇到join. 今天一起学习下join. join的作用:等待指定的时间(当为0时,一直等待),直到这个线程执行结束 ...

  2. Java多线程-join方法

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. 具体例子看链接 ...

  3. java多线程 join方法以及优先级方法

    /*join:当A线程执行到了B线程的.join()方法时,A就会等待.等B线程都执行完,A才会执行. join可以用来临时加入线程执行. 1.线程使用join方法,主线程就停下,等它执行完,那么如果 ...

  4. Java多线程--同步函数

    /*需求:银行有一个金库有两个储户分别存300元 每次存100元,存3次 目的:该程序是否有安全问题,如果有,如何解决? 如何找问题(很重要)1.明确哪些代码是多线程运行代码2.明确共享数据3.明确多 ...

  5. Java多线程 -join用法

    阿里面试官问我这个问题,我仔细总结了一下: 参考:sleep.yield.wait.join的区别(阿里面试) 1. join()介绍 join() 定义在Thread.java中.join() 的作 ...

  6. java 多线程——join()方法

    在java语言中,join()方法的作用是让调用该方法的线程在执行完run()方法后,再执行join 方法后面的代码. 简单点说就是,将两个线程合并,用于实现同步的功能. 具体而言:可以通过线程A的j ...

  7. java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

    1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数 ...

  8. java_ java多线程返回函数结果

    两种方式:一种继承Thread类实现:一种通过实现Callable接口. 第一种方法: 因为实现Thread类的run方法自身是没有返回值的,所以不能直接获得线程的执行结果,但是可以通过在run方法里 ...

  9. thread.join函数,java多线程中的join函数解析

    join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 package mian; public class simpleplela { static ...

  10. java 多线程总结篇2之——Thread类及常用函数

    此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...

随机推荐

  1. IOS App动态更新

    框架 JSPatch WaxPatch react-native   方案对比 目前已经有一些方案可以实现动态打补丁,例如WaxPatch,可以用Lua调用OC方法,相对于WaxPatch,JSPat ...

  2. 169 Majority Element [LeetCode Java实现]

    题目链接:majority-element /** * Given an array of size n, find the majority element. The majority elemen ...

  3. MySQL 高可用MHA安装部署以及故障转移详细资料汇总 转

    http://blog.itpub.net/26230597/cid-87082-list-2/ 1,简介 .1mha简介 MHA,即MasterHigh Availability Manager a ...

  4. placement new 操作符

    placement new操作符能够在分配内存时指定内存位置.下面的程序使用了placement new操作符和常规new操作符给对象分配内存. // placenew.cpp -- new, pla ...

  5. "jobTracker is not yet running"(hadoop 配置)

    今天自己尝试做配置了一下hadoop,环境是ubuntu13.10+jdk1.7.0_51+hadoop version1.2.1. 主要过程主要参考http://blog.csdn.net/hitw ...

  6. 关于Linux的10个核心面试问题与答案

    转载:http://www.linuxeden.com/html/news/20140222/148676.html 又到了以轻松的心情来读些严肃内容的时刻了,哈!这是另一篇关于面试问题的文章,我们将 ...

  7. HBase-再看HBase

    为什么HBase主要应用于在线应用系统?(还没搞懂) www.github.com/HBaseinaction google 三大论文  Google File System MapReduce Bi ...

  8. 关于Linux的总结(二)

    主要内容 Linux 安装 常用命令 VI编辑器的使用 远程登录 主机名的设置 IP的设置 防火墙的设置 用户和组账户管理 文件权限管理 RPM软件包管理 软件的安装 Jdk,tomcat, ecli ...

  9. linq检索带命名空间的xml

    XElement el = XElement.Load(fil); XNamespace ns = "http://schemas.microsoft.com/ado/2009/11/edm ...

  10. ubuntu共享文件夹给virtualbox

    在ubuntu或者linuxmint等linux系统下安装了virtualbox,可以通过共享文件夹的方式,把文件夹共享给virtualbox下的虚拟机系统,我这里的虚拟机系统是win7,共享过程如下 ...