百度了一下,终于明白了。这个解释最简单:
前提:join()方法肯定是被某个线程调用的。
 
A线程正在执行,突然执行的时候碰到了B.join(), 那么,A线程就必须要等到B线程执行完之后才能执行。
注意理解,是在A线程运行中,遇到了B.join().
MyTthread d = new MyThread();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t1.join();
t2.start();
 
这个是main线程运行的时候碰到了t1.join, 那么主线程就必须要等到t1线程执行完了之后,才能继续执行主线程。
 
至于,t1与t2线程,二者还是竞争关系。这个可以通过代码简单去验证:

package thread;

public class ThreadTest{
public static void main(String[] args) throws InterruptedException {
MyThread d1 = new MyThread("t1",2000);
MyThread d2 = new MyThread("t2", 2000);
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2); t1.start();
t2.start();
t1.join(); for(int i = 0; i < 50; i++){
System.out.println("Main:-->" + i);
}
}
} class MyThread extends Thread{
private String threadName;
private int times; public MyThread(String threadName, int times){
this.threadName = threadName;
this.times = times;
}
public void run(){
for(int i = 0 ; i < times; i++){
System.out.println(threadName + ":-->" + i);
}
}
}
这个的结果,main线程执行到t1.start(), t1线程启动后继续执行,当main线程执行到t1.join()时,main线程开始等待t1执行完成,完成之后,main线程继续执行,执行到t2.start()时,t2线程才开始启动。
如果10-12行换一下顺序:
t1.start();
t2.start();
t1.join();
那么,应该是t1线程和t2线程交叉执行,当执行到t1.join()时,main线程等待t1执行完成,但是t1和t2依然是竞争关系,等t1执行完成之后,main线程会开始执行,如果t2这个时候还没有完成,则t2又会和main线程交叉执行。
 
这个测试呢,只需要在MyThread d1 = new MyThread("t1",2000);时,通过控制t1和t2线程的打印此时来控制存活时间就可以了。比如t1与t2都比较大,那么看看最后一段是不是t1和t2交叉执行的,或者t1在t2后执行的,这样就能说明t1.join()对于t2是没有任何影响的。
 
一般,如果t1线程有一些耗费时间的处理,那么t1.join()就会保证等t1执行完成之前,main线程还存活者,main就相当于一个守护线程。 可能t1的处理结果正是main线程处理时需要的。
 
有些人理解成,将两个线程合并成一个,也很好理解。这里将t1与主线程合并成一个线程,t1继续与t2竞争执行。t1线程则是顺序执行的。t1部分完成之后,main部分开始执行。
 
也可以这么理解,t1.join相对于main来说,加一一把锁,控制了t1与main线程之间的同步。

Thread.join简单介绍的更多相关文章

  1. SQL Join简单介绍

    前沿 Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接.外联接和交叉联接等. 如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时 ...

  2. java多线程(简单介绍)

    简单介绍 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来 ...

  3. java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)

    本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: package com.zejian.test; /** * @author ...

  4. java fork/join简单实践

    我们知道,java8中有并行流,而并行流在后台的实现是通过fork/join池来完成的,例如: List<Integer> a = buildList(); List<Integer ...

  5. Thread.join()方法

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

  6. Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  7. 【转载】JMeter学习(一)工具简单介绍

    JMeter学习(一)工具简单介绍 一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静 ...

  8. TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍

    首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...

  9. MPI编程简单介绍

    第三章MPI编程 3.1 MPI简单介绍 多线程是一种便捷的模型,当中每一个线程都能够訪问其他线程的存储空间.因此,这样的模型仅仅能在共享存储系统之间移植.一般来讲,并行机不一定在各处理器之间共享存储 ...

随机推荐

  1. clip 属性剪裁绝对定位元素

    如果left >= right或者bottom <= top,则元素会被完全裁掉而不可见,即“隐藏”.通过这种方式隐藏的元素是可以被屏幕阅读器等辅助设备识别的,从而提高了页面的可用性. I ...

  2. NOPI Excel插件导入导出 图片批注

    dateTable导出到excel的MemoryStream /// <summary> /// DataTable导出到Excel的MemoryStream Export() /// & ...

  3. Android HandlerThread 的使用及其Demo (转)

    转自http://www.cnblogs.com/hnrainll/p/3597246.html 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现同时完成多 ...

  4. IOS 学习之 iOS沙盒(sandbox) 介绍 沙盒机制 文件操作(一)

    1.iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...

  5. Iso-Seq学习

    SMRT portal安装教程: http://www.pacb.com/wp-content/uploads/2015/09/SMRT-Analysis-Software-Installation- ...

  6. JavaScript 运动框架

    <script> window.onload=function (){ var oDiv=document.getElementById("div1"); oDiv.o ...

  7. python 使用总结

    本人原来是编写java的,后来转到编写ios之后,最后又来编写python了.相对于其他的一些开发人员来说,我精通的语言还是比较杂的. 这里将几个语言进行类比,比较一些个人的看法的东西. 首先obje ...

  8. 有关define定义函数所注意的实例

    #define SQR(x) x*x int m=1,k=2; a=SQR(k+m)/SQR(k+m); a=k+m*k+m/k+m*k+m; a=2+1×2+1/2+1×2+1=7.5 #defin ...

  9. 第六章第一个linux个程序:统计单词个数

    第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数.  第 1 步:建立 Linu x 驱 ...

  10. MySQL初探

    慕课网http://www.imooc.com/learn/122 课程学习笔记     修改MySQL提示符        shell>mysql --prompt 提示符        my ...