join是在某一个线程中调用。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
实际用处是,同时开启两个线程,但是B线程的运行需要A线程的结果,这就需要在B中调用A.join();(这就需要在B中定义一个线程用来引入A)
下面是一个例子,随机生成10个数(线程first),计算10个数的和(线程second),输出这个和(线程third)
为了便于观察,随机生成10个数的时候间隔1秒
public class test3 implements Runnable{
private int []arr;
public test3(int []arr){
this.arr=arr;
}
public void run(){//生成10个随机数
for (int i=0;i<10;i++)
{
arr[i]=(int)(Math.random()*10);
System.out.println("第"+(i+1)+"个数是"+arr[i]);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String []args){
int arr[]=new int[10];
Thread first=new Thread(new test3(arr));
Thread second=new Thread(new B(first, arr));
Thread third=new Thread(new C(second));
first.start();
second.start();
third.start();
}
}
class B implements Runnable{
Thread temp=null;
private int arr[];
private int sum;
public B(Thread t,int arr[]){
temp=t;
this.arr=arr;
sum=0;
}
public void run(){//计算10个数的总和
try {
temp.join();//先生成10个数
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i=0;i<10;i++)
sum=sum+arr[i];
C.sum=sum;
}
}
class C implements Runnable{
Thread temp=null;
static int sum=0;
public C(Thread t){
temp=t;
}
public void run(){//打印结果
try {
temp.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("10个数的总和是"+C.sum);
}
}
顺便说一个题外话,一个 .java文件可以有多个类,但是只能有一个public的类,并且这个.java文件名必须是这个public类。如果全部都是没有public修饰,那么任意一个类名作为文件名都可以。