线程没有控制台输出。线程不起作用?

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();
      }
    }

  }
}