多线程的新手,我遇到了一些问题和困惑。 :)
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.");
}
}
例外输出
我的输出
为什么我的控制台输出与预期输出不同?谢谢。
答案 0 :(得分:0)
NewThread类中的变量t
不是NewThread
类型,因此它永远不会执行子线程循环。你永远不会在NewThread对象上调用start(),所以从你的执行中看不到任何输出是有道理的。
System对象是静态的,并由在此VM上执行的所有线程共享。
答案 1 :(得分:0)
我认为问题是没有调用NewThread类的构造函数。关于构造函数的奇怪部分
NewThread() {
<STUFF>
}
是没有访问修饰符,即它缺少public
关键字。这使得构造函数包私有。如果你的ThreadDemo
类在不同的包中,它将无法看到构造函数,并且当你调用时,构造函数将随后不被执行
NewThread t = new NewThread();
因此,我认为您应该只将public
关键字添加到构造函数中,一切都很好。或者将NewThread
和ThreadDemo
类放在同一个包中。
答案 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();