在上面的例子中多次使用到了Thread类的join方法。我想大家可能已经猜出来join方法的功能是什么了。对,join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。下面的代码演示了join的用法

 1 package com.fly.join;
 2
 3 public class JoinThread extends Thread {
 4     public static int n = 0;
 5
 6     static synchronized void inc() {
 7         n++;
 8     }
 9
10     public void run() {
11         for (int i = 0; i < 10; i++)
12             try {
13                 inc();
14                 sleep(3); // 为了使运行结果更随机,延迟3毫秒
15
16             } catch (Exception e) {
17             }
18     }
19
20     public static void main(String[] args) throws Exception {
21
22         Thread threads[] = new Thread[100];
23         for (int i = 0; i < threads.length; i++)
24             // 建立100个线程
25             threads[i] = new JoinThread();
26         for (int i = 0; i < threads.length; i++)
27             // 运行刚才建立的100个线程
28             threads[i].start();
29
30         System.out.println("args.length="+args.length);
31         if (args.length > 0)
32             for (int i = 0; i < threads.length; i++)
33                 // 100个线程都执行完后继续
34                 threads[i].join();
35         System.out.println("n=" + JoinThread.n);
36     }
37
38 }

建立了100个线程,每个线程使静态变量n增加10。如果在这100个线程都执行完后输出n,这个n值应该是1000。

测试1: 上面运行的结果为不确定值,但是一般不等于1000。  因为并不是所有线程都运行完了,才执行最后的打印“n=" +JoinThread.n

测试2: 将31行代码修改为:args.length >= 0,  则结果输出一定为:1000.   即所有线程都执行完了才执行最后的打印“n=" +JoinThread.n

转载于:https://www.cnblogs.com/dragonflyyi/p/3538488.html

Java多线程初学者指南(5):join方法的使用相关推荐

  1. Java多线程初学者指南(10):使用Synchronized关键字同步类方法

    要想解决"脏数据"的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void run() {     ...

  2. Java多线程初学者指南(12):使用Synchronized块同步变量

    我们可以通过synchronized块来同步特定的静态或非静态方法.要想实现这种需求必须为这些特性的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这个类变量作为参数传 ...

  3. java多线程同步的四种方法_java中实现多线程的两种方法

    java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...

  4. 多线程中Thread的join方法

    多线程中Thread的join方法 join简介 join方法是Thread类中的一个方法,该方法的定义是等待该线程执行直到终止.其实就说join方法将挂起调用线程的执行,直到被调用的对象完成它的执行 ...

  5. Java 多线程启动为什么调用 start() 方法而不是 run() 方法?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:终于放弃了单调的swagger-ui了,选择了这款神器-knife4j个人原创100W+访问量博客:点击前往,查 ...

  6. java多线程有几种实现方法_Java多线程之间实现通讯

    一.课程目标 多线程之间如何通讯 wait.notify.notifyAll()方法 lock 停止线程 守护线程 Join方法 优先级 Yield 二.多线程之间如何实现通讯 2.1 什么是多线程之 ...

  7. java多线程实战指南_学习笔记《Java多线程编程实战指南》二

    2.1线程属性 属性 属性类型及用途 只读属性 注意事项 编号(id) long型,标识不同线程 是 不适合用作唯一标识 名称(name) String型,区分不同线程 否 设置名称有助于代码调试和问 ...

  8. Java多线程【三种实现方法】

    java多线程 并发与并行 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行 并行:一组程 ...

  9. java 多线程并行_Fork and Join: Java Can Excel at Painless Parallel Programming Too! | Oracle 中国...

    Java SE 7 提供的新分解/合并任务如何使编写并行程序变得更轻松? 下载: 多核处理器现在已广泛应用于服务器.台式机和便携机硬件.它们还扩展到到更小的设备,如智能电话和平板电脑.由于进程的线程可 ...

最新文章

  1. python工作-Python工作五年月薪23K,记录一下我的学习经历建议
  2. svd 分解详细证明
  3. 中国馆智能视频监控系统
  4. 使用ulimit设置文件最大打开数
  5. Git 合并分支选项 --squash 合并提交历史
  6. 在SQL Server2005中进行错误捕捉
  7. BugkuCTF-PWN题pwn6-printf超详细讲解(未提供Libc版本)
  8. Java PipedInputStream connect()方法与示例
  9. 计算机专业英语作业1,计算机专业英语作业1
  10. koa2 仿知乎笔记
  11. 《Reids 设计与实现》第三章 跳跃表
  12. 小程序文章怎么导出来_微信小程序点餐怎么申请,怎么建立微信点单小程序
  13. 明月传说怎么在电脑上玩 明月传说电脑版玩法攻略
  14. 重新学习FPGA(一):EDA技术
  15. bootstrap 下拉列表获取_Bootstrap框架下下拉菜单的实现(代码示例)
  16. 《微信小程序》音乐播放器项目
  17. 智能客服搭建(2) - MRCP Server ASR插件开发
  18. The JSP specification requires that an attribute name is preceded by whitespace出现错误
  19. Spring系列:2021年Java春招面试经历,内容太过真实
  20. 容联七陌助力VIPKID,优质客户服务赢得家长青睐

热门文章

  1. depcomp: line 571: exec: g++: not found
  2. shell scripts 之 代码量统计
  3. ubuntu下快速安装adb,fastboot的方法。
  4. linux 下的shell脚本
  5. 编辑器js获取浏览器高度和宽度值(转)
  6. Android RotateAnimation详解
  7. Android Gradle Plugin的Transform API
  8. Dalvik class加载的处理
  9. 计算机领域中随处可见的抽象
  10. SDNU 1085.爬楼梯再加强版(矩阵快速幂)