public class T_14 implements Runnable{ /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t=new Thread(new T_14());
t.start();
System.out.println("Started");
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Complete");
} public void run() {
// TODO Auto-generated method stub
for(int i=0;i<4;i++)
{
System.out.println(i);
}

}}
这道题的结果一定是started0123complete么?答案是,可我觉得不一定啊,高手帮忙看看,谢!

解决方案 »

  1.   

    Thread.join()的作用,
    请仔细参考JDK
      

  2.   

    我知道join的作用,不过我想会不会有这种可能,他先输出0,1,2什么的,而不是先输出started.
      

  3.   

    一定是,
    你的意思是说有可能先输出“0,1”什么的。
    但是要注意到,在执行Main函数的也是一个线程(暂且叫“线程X”),线程X是以独占的形式在使用CPU的资源。执行join()函数致使线程X阻塞。这个时候CPU才能空闲出来执行其他线程,于是才打印“0,1,2,3”。
    如果把代码改成这个样子再试就能理解了
    public class T_14 implements Runnable { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Thread t = new Thread(new T_14());
    t.start();
    System.out.println("Started_1");
    try {
    Thread.currentThread().sleep(100);
    } catch (InterruptedException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    System.out.println("Started_2");
    try {
    t.join();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println("Complete");
    } public void run() {
    // TODO Auto-generated method stub
    for (int i = 0; i < 4; i++) {
    System.out.println(i);
    }
    }
    }
      

  4.   

    因为线程t与线程main的优先级一样,所以按顺序执行,就先执行main线程,所以先打印"Started",再往下就是join()的作用了