线程没有控制台输出。线程不起作用?
There is no console output from thread. Thread doesn't work?
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");
}
}
}
控制台结果:
主要
主要的
主要的
主要的
...
主要的
主要的
主要的
主要
我找不到任何“运行”字样,这意味着 运行 方法没有 运行。有人可以为我解释一下吗?谢谢。
PS: 当i<10, i<100, i<1000, i<10000时,我可以找到“运行”这个词,但是当i<100000时,我就找不到'找不到“运行”这个词,这很奇怪
您的实施运行良好。您只是看不到 run
消息,因为还没有任何线程切换。
问题是您检查线程的操作太短了。例如,您可以插入一个 Thread.sleep(2000);
来检查它。
Run
已经打印出来了。但是你的 console-buffer 不够大。
将 Console-configuration 更改为无限缓冲区。
我发现你在输出中找不到 run
,问题是你应该了解 java 线程机制的工作原理,main
线程不会 等待 child 线程完成他们的工作,除非你明确说明,因此子线程是否在 [=12 之前完成=] 线程完成(并退出)不是预期的。
如果您确实希望 main
线程等待 child
线程完成,您可以通过以下方式使其具体化:
t.start();
t.join();
您必须捕获一些异常才能使这项工作正常进行。
但我认为您 应该 看到原始代码中打印的 run
的比例应该很高。因为看起来主线程更耗时。
不管怎样,如果您的 jvm 表现如此,也无可厚非。无论如何,线程执行顺序不受标准保护。
只需在循环中添加一秒的延迟,如下所示:
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();
}
}
}
}
首先,是的,您的代码实际上打印了 "run"。
只需在下面做这个小改动,您就会看到它。
一个更严格的测试,如果你能以不同的方式看到它,就是将字符串发送到文本文件而不是控制台。您一定会找到 "run".
这个词
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();
}
}
}
}
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");
}
}
}
控制台结果:
主要 主要的 主要的 主要的 ... 主要的 主要的 主要的 主要
我找不到任何“运行”字样,这意味着 运行 方法没有 运行。有人可以为我解释一下吗?谢谢。
PS: 当i<10, i<100, i<1000, i<10000时,我可以找到“运行”这个词,但是当i<100000时,我就找不到'找不到“运行”这个词,这很奇怪
您的实施运行良好。您只是看不到 run
消息,因为还没有任何线程切换。
问题是您检查线程的操作太短了。例如,您可以插入一个 Thread.sleep(2000);
来检查它。
Run
已经打印出来了。但是你的 console-buffer 不够大。
将 Console-configuration 更改为无限缓冲区。
我发现你在输出中找不到 run
,问题是你应该了解 java 线程机制的工作原理,main
线程不会 等待 child 线程完成他们的工作,除非你明确说明,因此子线程是否在 [=12 之前完成=] 线程完成(并退出)不是预期的。
如果您确实希望 main
线程等待 child
线程完成,您可以通过以下方式使其具体化:
t.start();
t.join();
您必须捕获一些异常才能使这项工作正常进行。
但我认为您 应该 看到原始代码中打印的 run
的比例应该很高。因为看起来主线程更耗时。
不管怎样,如果您的 jvm 表现如此,也无可厚非。无论如何,线程执行顺序不受标准保护。
只需在循环中添加一秒的延迟,如下所示:
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();
}
}
}
}
首先,是的,您的代码实际上打印了 "run"。 只需在下面做这个小改动,您就会看到它。
一个更严格的测试,如果你能以不同的方式看到它,就是将字符串发送到文本文件而不是控制台。您一定会找到 "run".
这个词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();
}
}
}
}