这段代码根本不打印主线程。它所做的一切就是打印子线程。但是如果我做了一个改变,也就是把"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) {}
}
}发布于 2015-04-06 22:14:23
没有答案:但我对你的程序做了一些修改,使它看起来更专业:
已将prctc2更改为Prctc2。类名应该总是大写的。
我从NewThread类中删除了Thread t成员。一个类应该总是只负责一件事:你的类负责两件事:它的第一个责任是打印出从1到5的数字,它的第二个责任是启动线程。
我将.start()调用移到了main() (IMO)中,这使得代码更容易理解。
我将NewThread重命名为MyTask。它不是Thread,由于我上面的更改,它甚至不再有线程,因此"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();
}
}
}https://stackoverflow.com/questions/29462294
复制相似问题