join是Thread类中定义的非静态,final方法,它是一个重载的方法,join()表示等待调用的线程。它让一个线程“加入到”另一个线程的尾部。如果线程B在线程A完成工作之前不能进行它的工作。则可以让线程B加入到线程A。它意味着线程B不会变成可运行的。不带参数的join()方法,一直等待线程A终止。那么我的理解是 b.join(a);应该有参数的,但实际上没有这样的使用。请看这个例子:
public class JoinTest {
   public static void main(String[] args) {
      ThreadCounter a = new ThreadCounter();
      ThreadCounter b = new ThreadCounter();
      b.start();
      a.start();
      try {
         b.join();
      } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      
   }}
class ThreadCounter extends Thread{
   
   public void run(){
      int i =0;
      for(;;){
         System.out.println(Thread.currentThread() + "" + i++);
         if(i>100000)break;
      }
   }
}那么(1)没有使用b.join(a)的方法。
(2)输出结果应该是
Thread[Thread-1,5,main]99997
Thread[Thread-1,5,main]99998
Thread[Thread-1,5,main]99999
Thread[Thread-1,5,main]100000在最后,因为必须待a(Thread-0)运行结束才行吧。

解决方案 »

  1.   

    多线程是这样执行的。new Thread(a).start();
    new Thread(b).start();你那样是串行。
      

  2.   

    线程同步用的。比如说我们两个人走路,各走各的,当其中一个打算join另外一个的 时候,另外一个人会等待。
    直到某种情况另一个人才会走。
      

  3.   

    现在这个功能好像用Callable接口吧。
      

  4.   

    那方法调用毕竟是两个人的事情,那么 b.join(a);可是实际没有这个a,有N个线程时,鬼知道跟在哪个后边。
      

  5.   

    大家 编程的时候都不用到这个join方法吗??
      

  6.   

    b.join()就OK了,问题在于你这段代码是在哪个线程调用的呢? 线程是一个隐藏的"人"
      

  7.   

    join()是Thread类提供的静态方法,用于多线程。简单点来说,就是加入你有两个线程(主线程不加入讨论)A,B,当线程A执行过程中出现了B.join(),则线程A就会停止当前执行,转而执行线程B,等待B线程执行完成之后就再执行线程A。在N个线程情况下,join()方法一般出现在某个线程的run()方法之中,因此其实如果在当前线程使用join(),JVM应该会先执行join()调用者线程,转而继续将CPU使用权给会当前run()方法对应线程,但是这个使用期间可能很短,也可能长。因此单单使用这个方法很难确定使用顺序,最好结合synchronized使用。或者使用yield(),再或者使用wait(),notify()/notifyAll(),interrup(),sleep()结合起来。
      

  8.   

         java 中的join()是在java线程联合时用到的。比如,要算十个数的和,线程一算一到五的和,
     线程二算六到十的和。这是就需要join,当一到五和算时,启动第二个线程,二.join().
      

  9.   

    哦 这个join 哦  
    以为是 数据库里面的了
      

  10.   

    join()是Thread类提供的静态方法,用于多线程。简单点来说,就是加入你有两个线程(主线程不加入讨论)A,B,当线程A执行过程中出现了 B.join(),则线程A就会停止当前执行,转而执行线程B,等待B线程执行完成之后就再执行线程A。在N个线程情况下,join()方法一般出现在某个线程的run()方法之中,因此其实如果在当前线程使用join(),JVM应该会先执行join()调用者线程,转而继续将CPU使用权给会当前 run()方法对应线程,但是这个使用期间可能很短,也可能长。因此单单使用这个方法很难确定使用顺序,最好结合synchronized使用。或者使用 yield(),再或者使用wait(),notify()/notifyAll(),interrup(),sleep()结合起来。
      

  11.   

    join 之后就可以把他理解成方法调用!马老师是这样说的
      

  12.   

    没见过b.join(a)的。。大家不都是用b.join();