多线程控制台输出不同

时间:2013-01-04 01:42:44

标签: java multithreading

多线程的新手,我遇到了一些问题和困惑。 :)

public class NewThread implements Runnable {

    Thread  t;

    NewThread() {
        t = new Thread(this, "Demo Thread");
        System.out.println("Child Thread " + t);
        t.start();
    }

    @Override
    public void run() {

        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("Child Thread: " + i);
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            System.out.println("Child Interrupted.");
        }

        System.out.println("Exiting Child Thread.");
    }

}

class ThreadDemo {

    public static void main(String[] args) {

        NewThread t = new NewThread();

        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("Main Thread: " + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            // TODO: handle exception
            System.out.println("Main Thread Interrupted.");
        }

        System.out.println("Main Thread Exiting.");
    }

}

例外输出

enter image description here

我的输出

enter image description here

为什么我的控制台输出与预期输出不同?谢谢。

4 个答案:

答案 0 :(得分:0)

NewThread类中的变量t不是NewThread类型,因此它永远不会执行子线程循环。你永远不会在NewThread对象上调用start(),所以从你的执行中看不到任何输出是有道理的。

System对象是静态的,并由在此VM上执行的所有线程共享。

答案 1 :(得分:0)

我认为问题是没有调用NewThread类的构造函数。关于构造函数的奇怪部分

  NewThread() {
        <STUFF>
    }

是没有访问修饰符,即它缺少public关键字。这使得构造函数包私有。如果你的ThreadDemo类在不同的包中,它将无法看到构造函数,并且当你调用时,构造函数将随后不被执行

 NewThread t = new NewThread();

因此,我认为您应该只将public关键字添加到构造函数中,一切都很好。或者将NewThreadThreadDemo类放在同一个包中。

答案 2 :(得分:0)

代码,你发布的很好!我得到了你预期的输出!

我怀疑你启动了其他代码,你用你的main中的另一个变量“t”覆盖你的变量“t”。也许您将代码的一部分声明为静态。

答案 3 :(得分:-3)

class ThreadDemo {

public static void main(String[] args) {

    NewThread t = new NewThread();

    try {
        for (int i = 5; i > 0; i--) {
            System.out.println("Main Thread: " + i);
            Thread.sleep(1000);
            t.run(); //// forgot here
        }
    } catch (InterruptedException e) {
        // TODO: handle exception
        System.out.println("Main Thread Interrupted.");
    }

    System.out.println("Main Thread Exiting.");
}

}

添加t.run();