import java.io.*;
import java.lang.Math;class Job extends Thread{
private String jobName;
private int loopLmt;
public Job(int loopLmt,String jobName){
this.loopLmt=loopLmt;
this.jobName=jobName;
}
private void PAUSE(double sec){
try{
Thread.sleep(Math.round(1000.0*sec));
}
        catch(InterruptedException ie){};
}
public void run(){
for(int i=1;i<=loopLmt;i++){
System.out.println(jobName+":work"+i);
PAUSE(Math.random());
}
}
}
public class Jobtest { public static void main(String[] args) {
        Job job1=new Job(4,"job1");
        Job job2=new Job(8,"job2");
        job1.start();
        job2.start();
        System.out.println("job1 is alive:  "+job1.isAlive()); //-----第一个打印
        try{
         job1.join();//------调用join
        }
        catch(InterruptedException ie){};
        System.out.println("job1 is alive:  "+job1.isAlive()); //-----第二个打印 }}运行结果:
job1:work1
job1 is alive:  true
job2:work1
job2:work2
job1:work2
job2:work3
job1:work3
job2:work4
job1:work4
job2:work5
job1 is alive:  false
job2:work6
job2:work7
job2:work8问题是:我想知道第一个打印和join什么时候调用,job1和job2调用start()之后不就是开始run起来吗?为什么会在run的时候执行下面的代码?

解决方案 »

  1.   

    main()可看做主线程job1.join();的意思是主线程等到线程job1结束运行后才接着执行所以第二个打印必定发生在job1结束之后,但这时候job2未必已经结束,所以输出结果是你看到的这样
      

  2.   

    我的问题的意思是说,他们调用star()之后不就是转去执行了run(),不停的轮转占用CPU时间吗?那些打印和job1.join应该是等他们的run执行完毕之后再执行的?
      

  3.   


    哦,我明白了 刚才查了下join的用法.......但是第一个打印是什么时候运行的?
      

  4.   

    job1,job2都start后,加上主线程main,这时候有3个线程在跑。
    第一个打印和job1.join()都是主线程在那时候跟另外两个线程竞争得到的时间片时执行的
    job1.join()后主线程就趴窝了
    等job1跑完,主线程重出江湖,跟job2竞争一起跑