java-多线程-join函数
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函数的更多相关文章
- 我也学习JAVA多线程-join
在工作中,挺少遇到join关键字,但很多多线程资料和面试过程中,初中级开发工程师总会遇到join. 今天一起学习下join. join的作用:等待指定的时间(当为0时,一直等待),直到这个线程执行结束 ...
- Java多线程-join方法
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. 具体例子看链接 ...
- java多线程 join方法以及优先级方法
/*join:当A线程执行到了B线程的.join()方法时,A就会等待.等B线程都执行完,A才会执行. join可以用来临时加入线程执行. 1.线程使用join方法,主线程就停下,等它执行完,那么如果 ...
- Java多线程--同步函数
/*需求:银行有一个金库有两个储户分别存300元 每次存100元,存3次 目的:该程序是否有安全问题,如果有,如何解决? 如何找问题(很重要)1.明确哪些代码是多线程运行代码2.明确共享数据3.明确多 ...
- Java多线程 -join用法
阿里面试官问我这个问题,我仔细总结了一下: 参考:sleep.yield.wait.join的区别(阿里面试) 1. join()介绍 join() 定义在Thread.java中.join() 的作 ...
- java 多线程——join()方法
在java语言中,join()方法的作用是让调用该方法的线程在执行完run()方法后,再执行join 方法后面的代码. 简单点说就是,将两个线程合并,用于实现同步的功能. 具体而言:可以通过线程A的j ...
- java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁
1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数 ...
- java_ java多线程返回函数结果
两种方式:一种继承Thread类实现:一种通过实现Callable接口. 第一种方法: 因为实现Thread类的run方法自身是没有返回值的,所以不能直接获得线程的执行结果,但是可以通过在run方法里 ...
- thread.join函数,java多线程中的join函数解析
join函数的作用,是让当前线程等待,直到调用join()的 线程结束或者等到一段时间,我们来看以下代码 package mian; public class simpleplela { static ...
- java 多线程总结篇2之——Thread类及常用函数
此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...
随机推荐
- IOS App动态更新
框架 JSPatch WaxPatch react-native 方案对比 目前已经有一些方案可以实现动态打补丁,例如WaxPatch,可以用Lua调用OC方法,相对于WaxPatch,JSPat ...
- 169 Majority Element [LeetCode Java实现]
题目链接:majority-element /** * Given an array of size n, find the majority element. The majority elemen ...
- MySQL 高可用MHA安装部署以及故障转移详细资料汇总 转
http://blog.itpub.net/26230597/cid-87082-list-2/ 1,简介 .1mha简介 MHA,即MasterHigh Availability Manager a ...
- placement new 操作符
placement new操作符能够在分配内存时指定内存位置.下面的程序使用了placement new操作符和常规new操作符给对象分配内存. // placenew.cpp -- new, pla ...
- "jobTracker is not yet running"(hadoop 配置)
今天自己尝试做配置了一下hadoop,环境是ubuntu13.10+jdk1.7.0_51+hadoop version1.2.1. 主要过程主要参考http://blog.csdn.net/hitw ...
- 关于Linux的10个核心面试问题与答案
转载:http://www.linuxeden.com/html/news/20140222/148676.html 又到了以轻松的心情来读些严肃内容的时刻了,哈!这是另一篇关于面试问题的文章,我们将 ...
- HBase-再看HBase
为什么HBase主要应用于在线应用系统?(还没搞懂) www.github.com/HBaseinaction google 三大论文 Google File System MapReduce Bi ...
- 关于Linux的总结(二)
主要内容 Linux 安装 常用命令 VI编辑器的使用 远程登录 主机名的设置 IP的设置 防火墙的设置 用户和组账户管理 文件权限管理 RPM软件包管理 软件的安装 Jdk,tomcat, ecli ...
- linq检索带命名空间的xml
XElement el = XElement.Load(fil); XNamespace ns = "http://schemas.microsoft.com/ado/2009/11/edm ...
- ubuntu共享文件夹给virtualbox
在ubuntu或者linuxmint等linux系统下安装了virtualbox,可以通过共享文件夹的方式,把文件夹共享给virtualbox下的虚拟机系统,我这里的虚拟机系统是win7,共享过程如下 ...