当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1

废话不多说看代码:

  1. package com.toov5.thread;
  2.  
  3. public class JoinThreadTest {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. Thread t1 = new Thread(new Runnable() {
  8.  
  9. @Override
  10. public void run() {
  11. for(int i=0;i<10;i++){
  12. try {
  13. Thread.sleep(1000);
  14. } catch (Exception e) {
  15. // TODO: handle exception
  16. }
  17. System.out.println(Thread.currentThread().getName()+"i"+i);
  18. }
  19.  
  20. }
  21. });
  22. t1.start();
  23.  
  24. //主线程在此调用t1.join()方法,就认为主线程应该把执行权交给t1 让t1执行完毕后再执行主线程
  25. try {
  26. t1.join();
  27. } catch (InterruptedException e1) {
  28. // TODO Auto-generated catch block
  29. e1.printStackTrace();
  30. }
  31. // t1.start();
  32.  
  33. for(int i=0; i<10;i++){
  34. try {
  35. Thread.sleep(10);
  36. } catch (InterruptedException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. System.out.println("main"+"i"+i);
  41. }
  42.  
  43. }
  44.  
  45. }

如果先调用join的方法在执行 启动线程

  1. package com.toov5.thread;
  2.  
  3. public class JoinThreadTest {
  4.  
  5. public static void main(String[] args) {
  6.  
  7. Thread t1 = new Thread(new Runnable() {
  8.  
  9. @Override
  10. public void run() {
  11. for(int i=0;i<10;i++){
  12. try {
  13. Thread.sleep(1000);
  14. } catch (Exception e) {
  15. // TODO: handle exception
  16. }
  17. System.out.println(Thread.currentThread().getName()+"i"+i);
  18. }
  19.  
  20. }
  21. });
  22. // t1.start();
  23.  
  24. //主线程在此调用t1.join()方法,就认为主线程应该把执行权交给t1 让t1执行完毕后再执行主线程
  25. try {
  26. t1.join();
  27. } catch (InterruptedException e1) {
  28. // TODO Auto-generated catch block
  29. e1.printStackTrace();
  30. }
  31. t1.start();
  32.  
  33. for(int i=0; i<10;i++){
  34. try {
  35. Thread.sleep(10);
  36. } catch (InterruptedException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. System.out.println("main"+"i"+i);
  41. }
  42.  
  43. }
  44.  
  45. }

结果分别:

其实质就是类似于一个加入线程

join(), 当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续
 join(int), 可以等待指定的毫秒之后继续

  1. package com.toov5.test;
  2.  
  3. public class demoJoin {
  4.  
  5. public static void main(String[] args) {
  6. Thread t1= new Thread() {
  7. @Override
  8. public void run() {
  9. for(int i =0; i<10; i++) {
  10. System.out.println(getName()+"...bbbbb");
  11. }
  12.  
  13. }
  14.  
  15. };
  16.  
  17. Thread t2 = new Thread() {
  18. public void run() {
  19. for (int i = 0; i < 10; i++) {
  20. if (i==2) {
  21. try {
  22. t1.join();
  23. } catch (InterruptedException e) {
  24.  
  25. e.printStackTrace();
  26. }
  27. }
  28. System.out.println(getName()+"...aaaaa");
  29.  
  30. }
  31.  
  32. };
  33. };
  34.  
  35. t1.start();
  36. t2.start();
  37.  
  38. }
  39.  
  40. }

可以看到:

aaa执行了两次后 就开始执行 bbb一直执行完毕 才可以执行 aaaaaa

也可以执行插队时间 join(1)    //过了指定的插队时间后 两个线程交替执行

注意: 要在start之后 调用join 否则不起作用

join()方法作用的更多相关文章

  1. 【多线程】java多线程 测试例子 详解wait() sleep() notify() start() join()方法 等

    java实现多线程,有两种方法: 1>实现多线程,继承Thread,资源不能共享 2>实现多线程  实现Runnable接口,可以实现资源共享 *wait()方法 在哪个线程中调用 则当前 ...

  2. 并发编程之多线程基础-join方法及优先级(五)

    join()方法作用 当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1 优先级 现代操作系统基本采用时分的形式调度运行的线程,线程分配得到的时间片的多少决定了线程使用处理 ...

  3. JAVA join()方法

    转自:http://www.open-open.com/lib/view/open1371741636171.html 一.为什么要用join()方法 在很多情况下,主线程生成并起动了子线程,如果子线 ...

  4. Thread.join()方法

    thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B.t.join() ...

  5. Java Thread.join()方法

    一.使用方式. join是Thread类的一个方法,启动线程后直接调用,例如: Thread t = new AThread(); t.start(); t.join(); 二.为什么要用join() ...

  6. 简谈Java的join()方法

    join()是Thread类的一个方法.根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this ...

  7. jQuery中的join方法

    和JS 中的JOIN 方法一样,将一数组按照JOIN的参数连接起来.比如: var arr = [ "a", "b", "c", " ...

  8. Java多线程中的join()方法

    一.join()方法介绍 join() 定义在Thread.java中.join()方法把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的join( ...

  9. 转载:Java多线程中join方法的理解

    转载自:http://uule.iteye.com/blog/1101994 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A ...

随机推荐

  1. TensorFlow笔记二:线性回归预测(Linear Regression)

    代码: import tensorflow as tf import numpy as np import xlrd import matplotlib.pyplot as plt DATA_FILE ...

  2. Android性能专项测试之耗电量统计API

    版权声明:本文为Doctorq原创文章,未经博主允许不得转载. https://blog.csdn.net/qhshiniba/article/details/49155979 参考文章:Androi ...

  3. vuex 深入理解

    参考自:https://mp.weixin.qq.com/s?src=11&timestamp=1528275978&ver=922&signature=ZeHPZ2ZrLir ...

  4. vue v-model使用说明

    1.概述 v-model 会忽略所有表单元素的 value.checked.selected 特性的初始值而总是将 Vue 实例的数据作为数据来源.你应该通过 JavaScript 在组件的 data ...

  5. OLR

    OLR:Oracle Local Registry 环境:11.2.0.3  RAC  RHEL6.5 It contains local node specific configuration re ...

  6. XMPP系列(三)---获取好友列表、加入好友

    1.心跳检測.掉线重连功能 client和server端都能够设置多久发送一次心跳包,假设对方没有返回正确的pong信息,则会断开连接,而加入掉线重连功能,则会自己主动进行连接. 假设自己写聊天功能还 ...

  7. Nginx配置SSL安全证书避免启动输入Enter PEM pass phrase

    之前两篇文章已经很好的介绍了Nginx配置SSL的一些情况,配置好的Nginx每次启动都要 输两遍PEM pass phrase,很是不爽,尤其是在服务器重启后,Nginx压根就无法自动启动,必须手动 ...

  8. 使用sphinx生成美观的文档

    先上效果图 详情 首先,须要知道什么是restructuredtext.能够理解为类似于markdown的一个东西. 然后 安装.pip install sphinx 进入存放文档的文件夹,在命令行, ...

  9. java变参

    java变参是通过数组来实现的 Object[] addAll(Object[] array1, Object... array2)和Object[] addAll(Object[] array1, ...

  10. Codeforces 467D Fedor and Essay bfs

    题目链接: 题意: 给定n个单词. 以下有m个替换方式.左边的单词能变成右边的单词. 替换随意次后使得最后字母r个数最少,在r最少的情况下单词总长度最短 输出字母r的个数和单词长度. 思路: 我们觉得 ...