此代码根本不打印主线程。它只是打印子线程。但是,如果我做了一个更改,即将语句“r.t.start()”从此try块中取出并将其放入自己的try块中。所以,当我这样做时,线程就像它们应该的那样工作。为什么会这样?
public class prctc2 {
public static void main(String args[]) {
NewThread r = new NewThread();
try {
r.t.start();
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + i);
Thread.sleep(1000);
}
} catch (Exception e) {}
}
}
class NewThread implements Runnable {
Thread t;
NewThread() {
t = new Thread(this, "new one");
}
public void run() {
try {
for (int i = 1; i <= 5; i++) {
System.out.println(t + " " + i);
Thread.sleep(500);
}
}
catch (Exception e) {}
}
}
答案 0 :(得分:0)
不是答案:但我对您的计划进行了一些更改,使其看起来更专业:
将prctc2
更改为Prctc2
。类名应始终大写。
我将Thread t
成员从NewThread
课程中取出。一个班级应该始终只对一件事负责:你的责任是两个:第一个责任是打印出从1到5的数字,第二个责任是启动线程。
我将.start()
调用移至main()
,其中(IMO)使代码更易于理解。
我将NewThread
重命名为MyTask
。它不是不是一个线程,并且由于我上面的更改,它甚至不再拥有一个线程,因此“thread”不应出现在其名称中。
我更改了异常处理程序以打印堆栈跟踪。您可以做的最糟糕的事情之一是忽略异常。如果你做了一些你不希望它做的事情,这可能会让你很难调试你的程序。
public class Prctc2 {
public static void main(String args[]) {
Thread r = new Thread(new MyTask());
r.start();
try {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + i);
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class MyTask implements Runnable {
public void run() {
try {
for (int i = 1; i <= 5; i++) {
System.out.println(t + " " + i);
Thread.sleep(500);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}