1

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

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.");
    }

}

例外输出

在此处输入图像描述

我的输出

在此处输入图像描述

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

4

4 回答 4

0

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

  NewThread() {
        <STUFF>
    }

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

 NewThread t = new NewThread();

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

于 2013-01-04T05:45:46.050 回答
0

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

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

于 2013-01-04T07:04:04.720 回答
0

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

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

于 2013-01-04T01:50:47.790 回答
-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();

于 2013-01-04T01:56:17.147 回答