java 多线程——join()方法
在java语言中,join()方法的作用是让调用该方法的线程在执行完run()方法后,再执行join 方法后面的代码。
简单点说就是,将两个线程合并,用于实现同步的功能。
具体而言:可以通过线程A的join() 方法来等待线程A的结束,或者使用线程A的join(1000)方法来等到线程A的结束,但是最多只等待1s.(时间数自己随便改。)
请看如下具体的例子,相信就会明白了
1.最原始的线程
public class TestJoin { public static void main(String[] args) {
Thread t = new Thread(new ThreadImp());
t.start();
try {
//主线程的执行
for(int i=0;i<=5;i++){
System.out.println("当前为主线程,此时i为"+i);
Thread.sleep(1000);
} System.out.println("join Finished");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } class ThreadImp implements Runnable{ @Override
public void run() {
try{
System.out.println("ThreadImp is begining");
Thread.sleep(5000); System.out.println("ThreadImp End"); }catch(InterruptedException e){
e.printStackTrace();
} } }
执行结果为:
当前为主线程,此时i为0
ThreadImp is begining
当前为主线程,此时i为1
当前为主线程,此时i为2
当前为主线程,此时i为3
当前为主线程,此时i为4
ThreadImp End
当前为主线程,此时i为5
join Finished
看以看到,最基本的线程之间来回切换执行。
2.当在主线程中代用 t线程的join方法后(不设置等待时间)
public class TestJoin { public static void main(String[] args) {
Thread t = new Thread(new ThreadImp());
t.start();
try {
t.join();//判断t线程是否还在
if(t.isAlive()){
System.out.println("the t has not finished.");
}else{
System.out.println("the t has finished.");
}
//主线程的执行
for(int i=0;i<=5;i++){
System.out.println("当前为主线程,此时i为"+i);
Thread.sleep(1000);
} System.out.println("join Finished");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } class ThreadImp implements Runnable{ @Override
public void run() {
try{
System.out.println("ThreadImp is begining");
Thread.sleep(5000); System.out.println("ThreadImp End"); }catch(InterruptedException e){
e.printStackTrace();
} } }
运行结果为:
ThreadImp is begining
ThreadImp End
the t has finished.
当前为主线程,此时i为0
当前为主线程,此时i为1
当前为主线程,此时i为2
当前为主线程,此时i为3
当前为主线程,此时i为4
当前为主线程,此时i为5
join Finished
可以看出 ,在主线程中调用t.join()方法, 导致t线程结束后再执行后面的主线程。
3. 设置join()等待的时间后
public class TestJoin { public static void main(String[] args) {
Thread t = new Thread(new ThreadImp());
t.start();
try {
t.join(2000);//主线程只等待t线程结束,只等待2秒
//判断t线程是否还在
if(t.isAlive()){
System.out.println("the t has not finished.");
}else{
System.out.println("the t has finished.");
}
//主线程的执行
for(int i=0;i<=5;i++){
System.out.println("当前为主线程,此时i为"+i);
Thread.sleep(1000);
} System.out.println("join Finished");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } class ThreadImp implements Runnable{ @Override
public void run() {
try{
System.out.println("ThreadImp is begining");
Thread.sleep(5000); System.out.println("ThreadImp End"); }catch(InterruptedException e){
e.printStackTrace();
} } }
运行结果:
ThreadImp is begining
the t has not finished.
当前为主线程,此时i为0
当前为主线程,此时i为1
当前为主线程,此时i为2
当前为主线程,此时i为3
ThreadImp End
当前为主线程,此时i为4
当前为主线程,此时i为5
join Finished
可以得到,t线程运行,等待t线程2s时间后,主线程便迫不及待的执行,此时t线程还没结束,然后t线程和主线程交替执行。
java 多线程——join()方法的更多相关文章
- java多线程 join方法以及优先级方法
/*join:当A线程执行到了B线程的.join()方法时,A就会等待.等B线程都执行完,A才会执行. join可以用来临时加入线程执行. 1.线程使用join方法,主线程就停下,等它执行完,那么如果 ...
- Java多线程-join方法
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. 具体例子看链接 ...
- 我也学习JAVA多线程-join
在工作中,挺少遇到join关键字,但很多多线程资料和面试过程中,初中级开发工程师总会遇到join. 今天一起学习下join. join的作用:等待指定的时间(当为0时,一直等待),直到这个线程执行结束 ...
- java线程join方法使用方法简介
本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { ...
- 简谈Java的join()方法
join()是Thread类的一个方法.根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this ...
- Java中join()方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join ...
- Java通过join方法来暂停当前线程
目标线程的join方法暂停当前线程,直到目前线程完成(从run()方法返回). Java代码: package Threads; import java.io.IOException; /** * C ...
- C#多线程JOIN方法初探
[说明:刚接触多线程时,弄不明白Join()的作用,查阅了三本书,都不明不白.后来经过自己的一番试验,终于弄清了Join()的本质.大家看看我这种写法是否易懂,是否真的写出了Join()的本质,多提宝 ...
- [java] java 线程join方法详解
join方法的作用是使所属线程对象正常执行run方法,而对当前线程无限期阻塞,直到所属线程销毁后再执行当前线程的逻辑. 一.先看普通的无join方法NoJoin.java public class N ...
随机推荐
- CNN tflearn处理mnist图像识别代码解说——conv_2d参数解释,整个网络的训练,主要就是为了学那个卷积核啊。
官方参数解释: Convolution 2D tflearn.layers.conv.conv_2d (incoming, nb_filter, filter_size, strides=1, pad ...
- hexo创建的tags和categories页面为空的解决办法
title: hexo创建的tags和categories页面为空的解决办法 toc: false date: 2018-04-16 02:26:10 主题:landscape 添加type以及men ...
- Android ViewPager 动画效果
找到个不错的开源项目:https://github.com/jfeinstein10/JazzyViewPager Android ViewPager 动画效果
- angular 报错笔记
1.错误信息: Failed to instantiate module app due to: Error: [$injector:unpr] http://errors.angularjs.org ...
- RMAN删除归档脚本
crosscheck archivelog all; delete noprompt expired archivelog all; delete noprompt archivelog un ...
- 定时清理clientmqueue目录垃圾文件防止占满磁盘空间
RedHat/CentOS 5.8 默认就有sendmail,而6.4默认没有. 手动清理方法: find /var/spool/clientmqueue/ -type f|xargs rm -f ...
- html转word文档
html转word文档 package cn.com.szhtkj.util; import java.io.ByteArrayInputStream; import java.io.File; im ...
- LA3231 Fair Share 二分_网络流
Code: #include<cstdio> #include<vector> #include<queue> #include<cstring> #i ...
- NOIp模拟赛二十八
(这是NOIp模拟赛?应该是NOI模拟赛不小心加了个p) 嗯,假装这是正经的NOIp模拟赛,从今天开始也写写题解吧(这几天被虐的惨惨) 今日情况:8+50+0=58 A题输出样例,B题正解写挂,C题不 ...
- Chrome扩展程序推荐
Chrome扩展程序 AdBlock 印象笔记 网页截图:注释&录屏 油猴 zenmate-vpn sourcegraph 推荐网站