1.第一个示例:

 package cn.threaddemo;

 public class T implements Runnable {

     public static int a = 0;

     @Override
public void run() {
System.out.print("t线程中的a:");
for (int k = 0; k < 5; k++) {
a = a + 1;
System.out.print(" "+a);
}
} public static void main(String[] args) throws Exception {
Runnable r = new T();
Thread t = new Thread(r);
t.start();
/* */
System.out.println("主线程中的a:"+a);
} }

输出结果:

主线程中的a:0
t线程中的a: 1 2 3 4 5

这是因为,当主线程 main方法执行 System.out.println("主线程中的a:"+a); 这条语句时,t 线程还没有真正开始运行,或许正在为它分配资源准备运行。因为为线程分配资源需要时间,而main方法执行完t.start()方法后继续往下执行System.out.println(a);   这个时候得到的结果是a还没有被改变的值0 。

2.Question: 怎样才能让主线程中的输出结果为5, join() 方法提供了这种功能,在第一个代码的基础上进行修改如下:

 package cn.threaddemo;

 public class T1 implements Runnable {

     public static int a = 0;

     @Override
public void run() {
System.out.print("t线程中的a:");
for (int k = 0; k < 5; k++) {
a = a + 1;
System.out.print(" "+a);
}
} public static void main(String[] args) throws Exception {
Runnable r = new T1();
Thread t = new Thread(r);
t.start();
t.join();//把线程t强制合并到主线程,使两个线程顺序执行,t线程执行完成后,再接着执行主线程
System.out.println("\n主线程中的a:"+a);
} }

执行结果如下:

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

  第一个示例中t线程和主线程是交替运行,当主线程中加入t.join();语句后,线程执行顺序变成了:先执行线程t, t线程执行结束后再接着执行主线程,由原来的线程交替并行执行变成了顺序执行。

3. 另外一种方式实现主线程中输出5:让主线程休眠一定时间,这种方式不能保证t线程一定会比主线程先执行完,当主线程设置休眠时间比较长时,可以保证t线程先于主线程完成

当主线程设置休眠时间比较短时,就不一定能保证了

线程join方法 小demo的更多相关文章

  1. Thread线程join方法自我理解

    Thread线程join方法自我理解 thread.join():等待thread线程运行终止,指的是main-thread(main线程)必须等待thread线程运行结束,才能继续thread.jo ...

  2. java线程join方法使用方法简介

    本博客简介介绍一下java线程的join方法,join方法是实现线程同步,可以将原本并行执行的多线程方法变成串行执行的 如图所示代码,是并行执行的 public class ThreadTest { ...

  3. python线程join方法

    转载:http://www.cnblogs.com/cnkai/p/7504980.html Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: ...

  4. 【转】线程join()方法的含义

    在很多情况下,主线程生成并启动了子线程,如果子线程里要进行大量的耗时运算,主线程往往将于子线程之前结束,但是如果主线程处理完其它事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后 ...

  5. [java] java 线程join方法详解

    join方法的作用是使所属线程对象正常执行run方法,而对当前线程无限期阻塞,直到所属线程销毁后再执行当前线程的逻辑. 一.先看普通的无join方法NoJoin.java public class N ...

  6. 线程join方法详解

    执行逻辑:在当前代码块(比如main方法)中的线程A执行了join方法, 那么当代码块(main)执行到join方法时,会停止继续向下执行,一直到线程A执行完毕, main方法才会继续向下执行. 代码 ...

  7. 线程join方法demo-模拟叫号看病

    package cn.chapter4.test5; public class SicknessDemo { /** * 模拟叫号看病 * @param args * * 思路:把普通号看病写在主线程 ...

  8. 一个自定义线程池的小Demo

    在项目中如果是web请求时候,IIS会自动分配一个线程来进行处理,如果很多个应用程序共享公用一个IIS的时候,线程分配可能会出现一个问题(当然也是我的需求造成的) 之前在做项目的时候,有一个需求,就是 ...

  9. 线程sleep方法的demo详解

    sleep:超时等待指定时间,时间到了之后,重新回到就绪状态,抢到CPU资源后,立马进入运行状态: package com.roocon.thread.t1; public class NewThre ...

随机推荐

  1. mysql 之 frm+ibd文件还原data

      此方法只适合innodb_file_per_table          = 1 当误删除ibdata 该怎么办? 如下步骤即可恢复: 1.准备工作 1)准备一台纯洁的mysql环境[从启动到现在 ...

  2. php函数名后冒号+数据类型(返回值类型限制/php新特性)

    在PHP7,一个新的功能,返回类型声明已被引入.返回类型声明指定的一个函数返回值的类型. int float bool string interfaces array callable 对象实例 如下 ...

  3. centos 问题解决记录

    在centos上用pip安装包,显示成功安装,但是用pip list去看发现实际上并没有安装? 安装用的是pip install xxx 是不行的,需要用sudo pip install xxx就可以 ...

  4. NOIP 2010 P1514 引水入城

    题目:传送门 题目概要:有一个n行m列的矩阵,每一个格子都有一个高度,路径只能从高处向低处扩散,问你如果最后一行可以全部被覆盖,最少要从第一行多少个格子开始,如果不能使最后一行全部被覆盖,求有多少个格 ...

  5. delphi之猥琐的webserver实现

    http://www.birdol.com/cainiaobiancheng/238.html delphi之猥琐的webserver实现 菜鸟编程  十五楼的鸟儿  7年前 (2009-01-01) ...

  6. C语言readdir()函数:读取目录函数

    相关函数:open, opendir, closedir, rewinddir, seekdir, telldir, scandir 头文件:#include <sys/types.h> ...

  7. 字符串模式匹配算法系列(二):KMP算法

    算法背景: KMP算法是由Donald Knuth和Vaughan Pratt于1970年共同提出的,而James H.Morris也几乎同时间独立提出了这个算法.因此人们将其称作“克努特-莫里斯-普 ...

  8. [LeetCode] 287. Find the Duplicate Number(Floyd判圈算法)

    传送门 Description Given an array nums containing n + 1 integers where each integer is between 1 and n  ...

  9. BZOJ 4675(点分治)

    题面 传送门 分析 由于期望的线性性,我们可以分别计算每个点对对答案的贡献 有三个人取数字,分开对每个人考虑 设每个人分别取了k个数,则一共有\(C_n^k\)种组合,选到每种组合的概率为\(\fra ...

  10. 三种分布式锁 简易说说(包含前一篇提到的redis分布式锁)

    大多数互联网系统都是分布式部署的,分布式部署确实能带来性能和效率上的提升,但为此,我们就需要多解决一个分布式环境下,数据一致性的问题. 当某个资源在多系统之间,具有共享性的时候,为了保证大家访问这个资 ...