class myRunnable implements Runnable {
public void run() {
// TODO Auto-generated method stub
System.out.println("run");
}
}
public class TestThread {
public static void main(String[] args) {
Runnable threadJob = new myRunnable();
Thread t = new Thread(threadJob);
t.start();
for (int i = 0; i < 100000; i++) {
System.out.println("main");
}
}
}
控制台中的Resutl:
主 主要 主要 主要 ... 主要 主要 主要 主
我找不到任何“运行”字样,这意味着run方法没有运行。有人可以为我解释一下。谢谢。
PS:当我&lt; 10,i&lt; 100,i&lt; 1000,i&lt; 10000时,我可以找到“运行”字,但是当我<100000然后我找不到“运行”字时,那只是很奇怪
答案 0 :(得分:4)
Run
已打印出来。但是你的控制台缓冲区不是很大。
将控制台配置更改为无限缓冲区。
答案 1 :(得分:1)
首先,是的,您的代码实际打印“运行”。 只需在下面做一点改动就可以了。
更严格的测试,如果你能以不同的方式看到它,就是将字符串发送到文本文件而不是控制台。你会发现“跑”这个词。
class myRunnable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("run");
}
}
public class TestThread {
public static void main(String[] args) {
Runnable threadJob = new myRunnable();
Thread t = new Thread(threadJob);
t.start();
for (int i = 0; i < 100000; i++) {
System.out.println("main");
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
答案 2 :(得分:0)
您的实施运行得很好。你只是没有看到你的run
消息,因为还没有任何线程切换。
问题是您检查线程的操作太短。例如,您可以插入Thread.sleep(2000);
来查看它。
答案 3 :(得分:0)
我觉得这有点你在输出中找不到run
,问题是你应该理解java线程机制是如何工作的,main
线程将不< / strong>等待子线程完成他们的工作,除非你使它具体,因此在main
线程完成(和退出)之前子项是否完成不是预期的。
如果您希望main
线程等待child
线程完成,您可以通过以下方式使其具体化:
t.start();
t.join();
你应该抓住一些例外来使这项工作。
但我认为你应该看到原始代码中印有run
的比例应该很高。因为看起来主线程更耗时。
无论如何,如果你的jvm表现得像这样,没有什么可怪的。无论如何,标准都没有保证线程执行顺序。
答案 4 :(得分:0)
只需在循环中添加一秒的延迟,如下所示:
class myRunnable implements Runnable {
public void run() {
System.out.println("run");
}
}
public class TestThread {
public static void main(String[] args) {
Runnable threadJob = new myRunnable();
Thread t = new Thread(threadJob);
t.start();
for (int i = 0; i < 100000; i++) {
System.out.println("main");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}