以下内容转载自:http://blog.csdn.net/wistronits/article/details/556035,用于学习、记录
run() 和start() 是大家都很熟悉的两个方法。把希望并行处理的代码都放在run() 中;stat() 用于自动调用run(),这是JAVA的内在机制规定的。并且run() 的访问控制符必须是public,返回值必须是void(这种说法不准确,run() 没有返回值),run()不带参数。
闲话少说,我们要讲的是join(),我们首先来看个例子:
代码:
/** * @author QingHe * Creation on 2005-12-19 */
public class ThreadTest implements Runnable { public static int a = 0;
public void run() { for (int k = 0; k < 5; k++) { a = a + 1; } }
public static void main(String[] args) throws Exception { Runnable r = new ThreadTest(); Thread t = new Thread(r); t.start(); System.out.println(a); } }
|
|
请问程序的输出结果是5吗?答案是:有可能。其实你很难遇到输出5的时候,通常情况下都不是5。当然这也和机器有严重的关系。为什么呢?我的解释是当主线程main方法执行System.out.println(a);这条语句时,线程还没有真正开始运行,或许正在为它分配资源准备运行吧。因为为线程分配资源需要时间,而main方法执行完t.start()方法后继续往下执行System.out.println(a);,这个时候得到的结果是a还没有被改变的值0。怎样才能让输出结果为5!其实很简单,join() 方法提供了这种功能。join() 方法,它能够使调用该方法的线程在此之前执行完毕。
代码:
/** * @author QingHe * Creation on 2005-12-19 */
public class ThreadTest implements Runnable { public static int a = 0;
public void run() { for (int k = 0; k < 5; k++) { a = a + 1; } }
public static void main(String[] args) throws Exception { Runnable r = new ThreadTest(); Thread t = new Thread(r); t.start(); t.join(); System.out.println(a); } }
|
|
这个时候,程序输入结果始终为5。
为了证明如果不使用t.join()方法,主线程main方法的System.out.println(a);语句将抢先执行,我们可以在main方法中加入一个循环,这个循环用来延长main方法执行的时间,循环次数将严重取决于机器性能。如果循环次数得当,我们也可以看到a的输出结果是5。
代码:
/** * @author QingHe * Creation on 2005-12-19 */
public class ThreadTest implements Runnable { public static int a = 0;
public void run() { for (int k=0; k<5; k++) { a = a + 1; } }
public static void main(String[] args) throws Exception { Runnable r = new ThreadTest(); Thread t = new Thread(r); t.start(); for (int i=0; i<300; i++) { /* 注意循环体内一定要有实际执行语句,否则编译器或JVM可能优化掉你的这段代码,视这段代 码为无效。 */ System.out.print(i); } System.out.println(); System.out.println(a); } }
|
|
分享到:
相关推荐
这篇文章主要介绍了python线程join方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 几个事实 1 python 默认参数创建线程后,不管主线程是否执行...
主要介绍了浅谈java线程join方法使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
下面小编就为大家带来一篇浅谈java多线程 join方法以及优先级方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Java多线程join方法实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
.NET多线程同步方法详解(一):自由锁(InterLocked) 本文主要描述在C#中线程同步的方法。...这种方法比较简单,当你在第一个线程运行时想等待第二个线程执行结果,那么你可以让第二个线程Join进来就可以了。
一个线程join另一个线程,(包括和interrupt互动的用法)1---马克-to-win java视频
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...
一个线程join另一个线程,(包括和interrupt互动的用法)3---马克-to-win java视频
一个线程join另一个线程,(包括和interrupt互动的用法)2---马克-to-win java视频
主要介绍了java 线程方法join简单用法,结合实例形式总结分析了Java线程join方法的功能、原理及使用技巧,需要的朋友可以参考下
Python_threading_3_join功能_(多线程_教学教程tutorial)
一 前言 温习python 多进程语法的时候,对 join的理解不是很透彻,本文通过代码实践来加深对 join()的认识。...join()方法可以在当前位置阻塞主进程,带执行join()的进程结束后再继续执行主进程的代码逻辑。 #
Java线程中yield与join方法的区别Java开发Java经验技巧共6页.pdf.zip
主要介绍了Python线程中对join方法的运用,join方法是阻塞线程的基本方法,需要的朋友可以参考下
线程调用类对象 在前面的示例中,我们为线程任务使用了通常的函数。实际上,我们可以使用任何可调用对象或者lambda函数,如下调用类对象的例子: #include #include class MyFunctor ... t.join();
之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。 Java线程调度...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
join() 定义在Thread.java中。 join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。这句话可能有点晦涩,我们还是通过例子去理解
线程编程——不使用pthread_join。 打包文件包含两个文件:c文件源代码、Makefile文件,运行环境在Ubuntu14.04下,使用自带的gcc编译器,同学们只需将文件夹复制到某一目录下之后在终端执行:1.“make”生成“test”...