java 线程协作 join()
在实际开发中我们往往会遇到这样的情况一个线程的执行需要依赖另一个线程执行后的结果。即主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。
join()
join() 方法主要是让调用该方法的thread完成run方法里面的任务后, 再执行join()方法后面的代。
主线程生成并起动了子线程,而子线程里要进行大量的耗时的运算(这里可以借鉴下线程的作用),当主线程处理完其他的事务后,需要用到子线程的处理结果,这个时候就要用到join();方法了。
//该方法会无限等待,它会一直阻塞当前线程直到目标线程(调用该方法的线程)执行完毕。
public final void join() throws InterruptedException {
join(0);
}
//该方法需要给出最大等待时间,如果目标线程的执行时间超过给定的时间,那么当前线程将不在等待目标线程执行结束而直接执行
public final synchronized void join(long millis)throws InterruptedException{}
public class ThreadJoinTest {
private static String str=null;
public static void main(String[] args) {
Thread thread=new Thread(){
@Override
public void run() {
try {
System.out.println("进入"+Thread.currentThread().getName()+"线程");
Thread.sleep(1000);
str="hello Word";
System.out.println(Thread.currentThread().getName()+"线程业务处理完毕");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
thread.start();
try {
//thread.join();//设置main线程等待子线程先处理业务
System.out.println(Thread.currentThread().getName()+"线程处理业务开始");
System.out.println("获取str值:"+str);
} catch (Exception e) {
e.printStackTrace();
}
}
} 执行结果:
main线程处理业务开始
进入Thread-0线程
获取str值:null
Thread-0线程业务处理完毕
运行代码,貌似永远都看不到str的值是"hello Word",而每次都是null,原因很简单的,因为在thread中的run方法中对str进行赋值操作前休眠了1秒,此时main线程中的System.out.println方法已经执行了,所以很难看到str的值是"hello Word",为了看到str的值是"hello Word",我们的一个思路就是等thread运行结束之后,我们再执行System.out.println就可以了,这时候join方法的作用就显现出来的,我们把上面的注释代码删除注释,然后运行,不管运行多少次,输出的结果都是“hello Word”,从这个例子中我们就可以看到join方法的作用,它能够调节各个线程之间的运行顺序,从而可以实现同步。
如果修改注释的代码为thread.join(100);则执行结果为:获取str值:null ,因为主线程已经等不及了。
join()他让调用线程在当前线程对象上进行等待当线程执行完毕后,被等待的线程会在推出前调用notifyAll()方法通知所有的等待线程继续执行。
public final synchronized void join(long millis) throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0; if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
} if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
java 线程协作 join()的更多相关文章
- java 线程方法join的简单总结
虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...
- java线程方法join的总结
虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...
- java 线程协作 wait(等待)与 notiy(通知)
一.wait().notify()和notifyAll() 为了更好的支持多线程之间的协作,JDK提供了三个重要的本地方法 //调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对 ...
- Java线程--interrupt join yield setDaemon常用方法的使用
概念: 操作系统可以有多个进程,一个线程可以有一个或多个线程.进程与进程之间不共享内存,都在各自的空间中运行.而线程不仅可以共享内存,还可以用有一个自己的内存空间,叫做线程栈. 线程又称轻量级进程.J ...
- java 线程方法 ---- join()
class MyThread2 implements Runnable{ @Override public void run() { for (int i = 0; i < 5; i++){ S ...
- java 线程协作 yield()
yield():方法的定义 调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程. 但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取 ...
- java 线程 wait join sleep yield notify notifyall synchronized
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 休息方法 : 在指定时间内 让该线程 暂停, 不会释放 锁标志. 等待方法: 让 该 线 ...
- java线程join方法使用方法简介
本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { ...
- 【Java并发专题之三】Java线程互斥、协作原理
(I)Java线程互斥原理之synchronized原理 从JDK5引入CAS原子操作,但没有对synchronized关键字做优化,而是增加了J.U.C.concurrent,concurrent包 ...
随机推荐
- Win7 64位 VS2013环境编译Lua5.3.1
主要参考这篇文章,原文有几个错误顺便改正了. 在Windows下使用Visual Studio编译Lua5.3 写本文时Lua官方网站放出的新版本为5.3.1,然后我不知道为啥,神奇的国内不能访问Lu ...
- Android adb命令 一
adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具.adb的工作方式比 ...
- [转载]Firebird与MySQL:一个使用者的体会
老板要我开发一个LINUX平台上的数据库项目,要求一定要用开源免费数据库.我知道这个数据库必须能够上网操作,同时作为公司的核心骨干数据库,除了必须是稳定的存储数据库外还必须有很强的数据和数据库控管功能 ...
- Centos7安装完毕后重启提示Initial setup of CentOS Linux 7 (core)的解决方法
问题: CentOS7安装完毕,重新开机启动后显示: Initial setup of CentOS Linux 7 (core) 1) [x] Creat user 2) [!] License i ...
- webform 中使用ajax
常用的方式有 js –> WebService , js->*.ashx, js->WebAPI, js->MVC Controller->Action. 前两种就不说 ...
- 工作随笔——UIButton的EdgeInsets + Swift中的正则表达式;
1.UIButton的EdgeInsets UIButton的EdgeInsets方法,是用来设置title和image对于上左下右四个方向的偏移,但是很奇怪的是,刚开始只有Image,titile也 ...
- Cookie与Session的区别-总结很好的文章
Cookie与Session的区别-总结很好的文章 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Session有一个更深入的了解,并对 ...
- python 库安装
用到再更新. #Windows 一 exe 安装包 http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn 二 setup.py cmd 进入目 ...
- wxGlade的图标,竟来自名画!
一直用wxGlade做GUI的,今天突然发现它的图标和一副油画很像,查了下资料果然如此. wxGlade的图标,而且图标的文件名竟然就叫做mondrian.ico 下面是蒙德里安的作品,<构图 ...
- caffe在windows 下的配置及matlab接口编译(无GPU)
本人机子windows 10,matlab2015a,vs2013(官网使用的是vs2013) 1.首先去github上下载caffe的windows包,地址:https://github.com/B ...