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线程有优先级,优先级高的线程会获得较多的运行机会 ...
随机推荐
- Pimp_my_Z1
https://github.com/Androguide/Pimp_my_Z1 Pimp_my_Z1-master.zip
- web app页面要求
代码: <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum- ...
- 和Timesten有个约会--Timesten技术专栏系列(一)
作者: 三十而立 时间:2009年10月03日 12:08:42 本文出自 “inthirties(三十而立)”博客,转载请务必注明作者和保留出处http://blog.csdn.net/inthir ...
- iOS开发——语法&高级Block练习
高级Block练习 一 .最简单的block使用 使用block的三个步骤:1.定义block变量 2.创建block代码块 3.调用block匿名函数 定义一个block的构成包括:返回值,bloc ...
- C++标准转换运算符const_cast
前面讲了C++继承并扩展C语言的传统类型转换方式,最后留下了一些关于指针和引用上的转换问题,没有做详细地讲述.C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymor ...
- 关于php配置文件
一:配置文件(php.ini)在 PHP 启动时被读取.对于服务器模块版本的 PHP,仅在 web 服务器启动时读取一次.对于 CGI 和 CLI 版本,每次调用都会读取. 二:Note that t ...
- Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值
package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...
- Spring 事务管理高级应用难点剖析--转
第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...
- [改善Java代码]静态变量一定要先声明后赋值
建议32: 静态变量一定要先声明后赋值 这标题看着让人很纳闷,什么叫做变量一定要先声明后赋值?Java中的变量不都是先声明后使用的吗?难道还能先使用后声明?能不能暂且不说,我们先来看一个例子,代码如下 ...
- [设计模式]<<设计模式之禅>>工厂方法模式
1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟地,未有人民,女娲搏黄土做人”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹 ...