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线程有优先级,优先级高的线程会获得较多的运行机会 ...
随机推荐
- GitHub使用详解
1.GitHub是什么? GitHub这个名词既可以是那个流行的代码分享和协作网站 https://github.com/,也可以是指Git客户端工具(与其他的Git客户端工具如GitEye类似,只不 ...
- iOS开发——实用篇&提高iOS开发效率的方法和工具
提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...
- Metadata Lock原理3
http://blog.itpub.net/26515977/viewspace-1208250/ 腾讯工程师 随着5.5.3引入MDL,更多的Query被“Waiting for table ...
- extern的困惑
摘自:http://blog.csdn.net/fxjtoday/article/details/6021845 如果想明白为什么需要extern, 需要从编译和链接讨论起, 现代编译器一般采用按文件 ...
- HDU--杭电--1195--Open the Lock--深搜
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hive-初看hive
网上搜了一下找了很多介绍hive的资料,不是官方翻译就是含糊描述,对于刚接触的很难直观认识 我从一本介绍hadoop的书里找到了一些hive的资料,没太多废话.可以看看 http://pan.baid ...
- Subsequence
Description A sequence of N positive integers (10 < N < 100 000), each of them less than or eq ...
- javaweb学习总结二十一(servlet开发入门、servlet生命周期以及调用过程)
一:servlet开发入门 servlet是sun公司一门开发动态web资源的技术,下面编写一个servlet入门程序: 1:在tomcat服务器webapps目录下新建firstServlet目录, ...
- [改善Java代码]非稳定排序推荐使用List
我们知道Set与List的最大区别就是Set中的元素不可以重复(这个重复指的equals方法的返回值相等),其他方面则没有太大的区别了,在Set的实现类中有一个比较常用的类需要了解一下:TreeSet ...
- poj 1987 树的分治
思路:1741的A1送 1. #include<iostream> #include<cstring> #include<algorithm> #include&l ...