`

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并发编程的基础。同时,使用时需特别注意...

    java Fork Join框架及使用

    1. 除了fork()和join()方法外,不得使用其他的同步工具。线程最好不要调用sleep()方法。 2. 线程不得进行I/O操作,因为I/O操作会导致线程阻塞,这会降低任务的并行度。 3. 线程不得抛出checked exception,如果需要...

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

    4. **Join(合)**:当子任务完成后,原始任务会使用`join()`方法等待所有子任务的结果,然后合并结果或继续执行后续逻辑。 5. **工作窃取**:每个工作线程除了处理自己的任务队列外,还会尝试“窃取”其他线程的...

    用java写的左关联右关联join类

    在Java编程语言中,"左关联"和"右关联"是数据库查询操作中的概念,通常在SQL中使用JOIN语句实现。在这个场景下,我们讨论的是如何使用Java代码来模拟这些数据库操作,以达到高效、便捷地处理数据关联的目的。 首先...

    oracle-join用法

    Oracle Join是数据库操作中一种非常重要的技术,用于合并多个表的数据。在Oracle SQL中,Join主要分为几个类型,包括INNER JOIN、LEFT ...在Java开发中,正确地使用JOIN可以使代码更简洁,更高效地处理跨表的数据操作。

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

    浅谈Java线程join方法使用方法 Java中的线程join方法是一种实现线程同步的方式,可以将原本并行执行的多线程方法变成串行执行的。在Java中,线程join方法的作用是使当前线程等待另一个线程的结束,然后再继续执行...

    【IT十八掌徐培成】Java基础第08天-02.多线程-join-daemon-同步.zip

    例如,在处理数据的线程A完成后,我们可能希望清理资源的线程B再开始,这时就可以使用`join()`。 接着是`daemon`线程。在Java中,主线程(用户线程)是程序执行的入口,而`daemon`线程则是一种后台服务线程,它不...

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

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

    Java线程之join_动力节点Java学院整理

    Java线程中的`join()`方法是一个非常重要的同步工具,它允许一个线程(通常为主线程)等待另一个线程(子线程)执行完成后再继续执行。`join()`方法定义在`java.lang.Thread`类中,它使得多线程间的协作更加有序。 ...

    Java并发Fork and join

    Fork/Join框架是Java并发库中的一部分,自Java 7开始引入,它为开发者提供了一种高效的处理大规模计算任务的方法。这个框架基于分治策略,将大任务分解成若干小任务,然后并行执行这些小任务,最后再将结果合并。...

    译文:Fork and Join: Java Can Excel at Painless Parallel Programming Too!

    总结来说,Fork/Join框架是Java并发编程的重要进步,它通过提供一种易于理解和使用的并行编程模型,降低了编写高效并发程序的难度。结合java.util.concurrent包中的其他工具,开发者可以构建出既安全又高效的并发...

    java 携子之手 与子偕老(join)

    在上述代码中,`Partner.java`可能包含了一个示例,演示了如何使用join()方法来协调两个或多个线程的执行。而`Java.jpg`可能是用来辅助理解多线程概念的图片,例如展示线程的生命周期或join()方法在程序流程中的位置...

    Java8集合 CompletableFuture lambda表达式 新的TimeAPI 和ForkJoin Demo包

    在这个"Java8集合 CompletableFuture lambda表达式 新的TimeAPI 和ForkJoin Demo包"中,我们可以深入探讨以下几个关键知识点: 1. **Lambda表达式**: Lambda表达式是Java 8的一大亮点,它简化了对匿名函数的处理...

    Java线程中yield与join方法的区别Java开发J

    在Java多线程编程中,理解并正确使用`yield`和`join`方法是至关重要的。这两个方法都属于线程控制策略的一部分,但它们的作用和使用场景有所不同。 首先,我们来详细探讨`Thread.yield()`方法。这个方法的目的是让...

    Java并发Fork-Join框架原理

    例如,在Java8中,使用LongStream.rangeClosed方法可以生成一个顺序流,而使用parallel方法可以将其转换为并行流。 LongStream.rangeClosed(0, 10000000000L).sequential(); LongStream.rangeClosed(0, ...

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

    在Java编程语言中,`Thread.join()`方法是一个非常重要的同步工具,它允许一个线程(调用者)等待另一个线程(被调用者)执行完成。`Thread.join()`的使用能够有效地解决多线程环境中的顺序执行问题,确保线程间的...

    JAVA多线程之方法 JOIN详解及实例代码

    Java中的`join()`方法是多线程编程中的一个重要特性,用于控制线程间的协作和同步。在Java中,多线程允许程序同时执行多个任务,但有时我们需要确保某些线程按照特定顺序完成,或者主线程需要等待其他线程执行完毕后...

    Java join 线程控制用法

    Java中的`join()`方法是线程控制的一种重要手段,它允许一个线程等待另一个线程完成其执行。在多线程编程中,我们经常需要确保某些线程按特定顺序执行,或者在一个线程运行完毕后再启动另一个线程,`join()`方法就是...

    Java ForkJoin框架的原理及用法

    Java ForkJoin框架的原理及用法 Java ForkJoin框架是Java 1.7后提供的一种多线并发处理框架,主要思想是分而治之,将复杂的计算按照设定的阈值进行分解成多个计算,然后将各个计算结果进行汇总。ForkJoin框架的使用...

Global site tag (gtag.js) - Google Analytics