`

java join的用法

    博客分类:
  • java
阅读更多

转自http://blog.csdn.net/anhuixiaozi/article/details/4548679

join的用法,先看几个例子在说。

 

程序1:
public class ThreadTest implements Runnable {

 

 public static int a = 0;
 public synchronized void inc() {
  a++;
 }

 

 public void run() {
  for (int i = 0; i < 5; i++) {
   inc();
  }
 }

 

 public static void main(String[] args) throws Exception {


  Runnable r = new ThreadTest();
  Thread t1 = new Thread(r);
  t1.start();

 

  System.out.println(a);


 }
}

咋一看以为结果是:5  ,其实不然

 

程序2:在一基础上添加点东西 System.out.println(a+",");


public class ThreadTest implements Runnable {

 

 public static int a = 0;
 public synchronized void inc() {
  a++;

System.out.println(a+",");
 }

 

 public void run() {
  for (int i = 0; i < 5; i++) {
   inc();
  }
 }

 

 public static void main(String[] args) throws Exception {


  Runnable r = new ThreadTest();
  Thread t1 = new Thread(r);
  t1.start();

 

  System.out.println(a);


 }
}

 

结果:

0

1,2,3,4,5,

说明a已经被加了5次。但有两个问题

1)为什么main方法中的打印语句还是0呢?

2)为什么main方法中的打印语句先执行了呢?

 

程序3

public class ThreadTest implements Runnable {

 

 public static int a = 0;
 public synchronized void inc() {
  a++;
 }

 

 public void run() {
  for (int i = 0; i < 5; i++) {
   inc();
  }
 }

 

 public static void main(String[] args) throws Exception {


  Runnable r = new ThreadTest();
  Thread t1 = new Thread(r);
  t1.start();

 

   for (int i=0; i<300; i++) {
      System.out.print(i);
   }
   System.out.println();
   System.out.println(a);

 }
}

 

结果:

0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
5

此时的结果5正确了。说明线程在i循环100次后,全部都结束了。

之所以会产生1)2)原因是:由于有两个线程,我们不知道主线程执行到什 么时候开始执行子线程,这是由于虽然你调用start方法但是调用该方法只是准备线程并不是马上启动.所以,当程序执行的时候,很随机地执行这两个线程中 的一个,也就很随机地执行System.out.println(a); 这个语句了.于是,有可能子线程只执行了1次a=+1这个语句,也可能是2次或者其它多少次,还可能是0次,所以打印的结果是个随机数

 

程序4:在程序1的基础上添加 t1.join(); 达到与程序3同样的效果

 

public class ThreadTest implements Runnable {

 

 public static int a = 0;
 public synchronized void inc() {
  a++;
 }

 

 public void run() {
  for (int i = 0; i < 5; i++) {
   inc();
  }
 }

 

 public static void main(String[] args) throws Exception {


  Runnable r = new ThreadTest();
  Thread t1 = new Thread(r);
  t1.start();

 

   t1.join();
   System.out.println(a);

 }
}

 

结果:5

 

总结:join方法的功能就是使异步执行的线程变成同步执行。也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方法。如果不使用join方法,就不能保证当执行到start方法后面的某条语句时,这个线程一定会执行完。而使用join方法后,直到这个线程退出,程序才会往下执行。

 

分享到:
评论

相关推荐

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    Java线程中wait、await、sleep、yield、join用法汇总,文章里面总结了这些关键字的用法,并且里面带有源码帮助分析用法,此一文就可以理解这些关键字用法,推荐拥有

    java NIO用法及java fork/join 用法源码工程

    1.ServerSocketChannel与SocketChannel通讯 2.java Fork/Join 与ThreadPool使用

    java 线程方法join简单用法实例总结

    主要介绍了java 线程方法join简单用法,结合实例形式总结分析了Java线程join方法的功能、原理及使用技巧,需要的朋友可以参考下

    oracle-join用法

    oracle-join,java代码展示。

    浅谈java线程join方法使用方法

    主要介绍了浅谈java线程join方法使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java join 线程控制用法

    Java join 线程控制用法,需要的朋友可以参考一下

    java 中Thread.join()的使用方法

    主要介绍了java 中Thread.join()的使用方法的相关资料,需要的朋友可以参考下

    Java使用join方法暂停当前线程

    主要为大家详细介绍了Java使用join方法暂停当前线程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    一个线程join另一个线程,(包括和interrupt互动的用法)1---马克-to-win java视频

    一个线程join另一个线程,(包括和interrupt互动的用法)1---马克-to-win java视频

    java8中forkjoin和optional框架使用

    主要介绍了java8中forkjoin和optional框架使用心得以及用法讲解,需要的朋友参考下吧。

    lucene-join-7.2.1-API文档-中英对照版.zip

    使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    Java ForkJoin框架的原理及用法

    主要介绍了Java ForkJoin框架的原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java开发技术大全(500个源代码).

    demoJoin.java 演示使用join()以确保主线程最后结束 clicker.java 一个计数用的线程类 demoPri.java 调用上面这个类设置线程优先级示例 myThread.java 自己定义的一个Thread的子类 mutexThread.java 一个能管理...

    java基本教程之join方法详解 java多线程教程

    本文对java Thread中join()方法进行介绍,join()的作用是让“主线程”等待“子线程”结束之后才能继续运行,大家参考使用吧

    lucene-join-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-join-6.6.0.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    eclipse-collections-forkjoin-7.1.2-API文档-中文版.zip

    赠送jar包:eclipse-collections-forkjoin-7.1.2....使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    parent-join-client-6.2.3-API文档-中英对照版.zip

    使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    Java中Thread.join()的使用方法

    主要介绍了Java中Thread.join()的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    JDK7中的ForkJoin模式

    随着多核时代的来临,软件开发人员不得不开始关注并行编程领域。...本文将介绍使用 JDK 7 中 Fork/Join 模式的方法和其他相关改进。阅读本文之后,读者将能够独立地在软件开发中使用 Fork/Join 模式来改进程序的性能。

    parent-join-client-6.3.0-API文档-中英对照版.zip

    使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

Global site tag (gtag.js) - Google Analytics