java多线程系列_join方法的使用(5)

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

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

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

    1.  测试1

    使用如下的命令运行上面程序:

1 java mythread.JoinThread

程序的运行结果如下:

1 n=442

这个运行结果可能在不同的运行环境下有一些差异,但一般n不会等于1000.从上面的结果可以肯定,这100个线程并未都执行完就将n输出了。

    2.  测试2

    使用如下的命令运行上面的代码:

    在上面的命令行中有一个参数join,其实在命令行中可以使用任何参数,只要有一个参数就可以,这里使用join,只是为了表明要使用join方法使这100个线程同步执行。

    程序的运行结果如下:

1 n=1000

无论在什么样的运行环境下运行上面的命令,都会得到相同的结果:n=1000.这充分说明了这100个线程肯定是都执行完了,因此,n一定会等于1000.

原文:http://java.chinaitlab.com/line/778862.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老九学堂

Java微课堂之基本选择结构2

本节讲解知识点回顾 ? ? ? 本节编程技巧和注意事项 条件选择结构关于分号和大括号什么时候可以打,什么时候不用打,它的意义是不同的。

28760
来自专栏大闲人柴毛毛

深入理解JVM(十)——类加载器

类与类加载器 类加载器的作用:将class文件加载进JVM的方法区,并在方法区中创建一个java.lang.Class对象作为外界访问这个类的接口。 类与类加...

39760
来自专栏Python小屋

Python导入标准库和扩展库对象的几种方式

Python中的对象大概可以分为三类:内置对象、标准库对象和扩展库对象。其中内置对象是直接编译进解释器的可以直接使用,没有对应的Python源代码;标准库对象是...

63880
来自专栏dizhiling专栏

一行命令实现cpu占用率100%

cat /proc/cpuinfo |grep "physical id" | wc -l 可以获得CPU的个数, 我们将其表示为N.

13810
来自专栏linux驱动个人学习

assert断言

assert是一个宏定义,其作用是如果它的条件返回错误,则终止程序执行,原型定义: 1 #include <assert.h> 2 void assert( i...

36550
来自专栏专注 Java 基础分享

初识Hibernate之理解持久化类

     上一篇文章我们简单介绍了Hibernate相关的一些最基本的文件及其作用,并在最后完整的搭建了Hibernate的运行环境,成功的完成了与数据库的映射...

21280
来自专栏Python小屋

Python多线程编程中daemon属性的作用

在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一: 如果某个子线程的daem...

35450
来自专栏Aloys的开发之路

VIM常见用法总结

vim中光标如何回到上一次位置 ctrl + o vim如何删除某行至某行之间的内容? 删除3104至5403行之间的内容: :3104,5403d vim使光...

39660
来自专栏Python

python flask里 post请求,JSON数据获取方式总结

#!flask/bin/python #encodig=utf-8 # _*_ coding:utf-8 _*_ # Writer : byz # dateTi...

65850
来自专栏Kevin-ZhangCG

[ Java面试题 ]多线程篇

28370

扫码关注云+社区

领取腾讯云代金券