【问题标题】:There is no console output from thread. Thread doesn't work?线程没有控制台输出。线程不工作?
【发布时间】:2015-01-26 12:05:13
【问题描述】:
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

【问题讨论】:

  • 你看到了多少个“主要”词?如果您的控制台仅显示最后 100 行(例如),则“运行”一词可能已超出缓冲区范围
  • 仅测试线程,减少循环数,以便您可以轻松检查输出。以i &lt; 10 为例进行测试;然后您将看到预期的行为。
  • 为什么不直接打印“run”?
  • 是的,因为您的控制台日志是有限的。
  • 正是它应该如何工作,你刚刚发现了一个叫做“控制台缓冲区”的东西 - 记住它,一旦你继续你的探索任务,它可能是重要的一天。

标签: java multithreading java-threads


【解决方案1】:

Run 已打印出来。但是您的控制台缓冲区不够大。

将控制台配置更改为无限缓冲区。

【讨论】:

  • 我没有勾选“限制控制台输出”,它运行良好,我可以找到“运行”这个词,再次感谢您:D
【解决方案2】:

首先,是的,您的代码实际上打印了“运行”。 只需在下面进行这个小改动,您就会看到它。

如果你能以不同的方式看到它,一个更严格的测试是将字符串发送到文本文件而不是控制台。你肯定会找到“运行”这个词。

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

  }
}

【讨论】:

    【解决方案3】:

    您的实现运行良好。您只是看不到您的run 消息,因为还没有任何线程切换。

    问题在于您检查线程的操作太短。例如,您可以插入 Thread.sleep(2000); 来查看它。

    【讨论】:

    • 我不这么认为,可能“run”被打印出来了,他只是想念它。
    • 你关于“线程切换”的说法没有任何意义。我猜你指的是上下文切换——它完全由虚拟机管理,对线程执行几乎没有影响,从高层次的角度来看,每个线程似乎都是同时并发运行的,所以 output 到@ 987654323@ 将立即显示,可能会显示在第 3 行或第 4 行(运行时很早),具体取决于当前的系统负载。
    • @specializt 好吧,不,这个答案实际上是有道理的。正确的定义其实是“线程上下文切换”,所以实际上他的用法比你的更具体(“上下文切换”也可以指“进程上下文切换”,所以很模糊)。不,JVM 不会切换线程,操作系统会(线程创建是本机调用,您可以查看 Thread 类的源代码)。是的,它似乎同时运行,但可能是也可能不是。
    【解决方案4】:

    我发现你在输出中找不到run,问题是你应该了解java线程机制是如何工作的,main 线程将不会等待让 child 线程完成他们的工作,除非你具体说明,因此子线程是否在 main 线程完成(并退出)之前完成是不期望的。

    如果您确实希望 main 线程等待 child 线程完成,您可以通过以下方式使其具体化:

     t.start();
     t.join();
    

    您必须捕获一些异常才能使其正常工作。

    但我认为您应该在原始代码中看到run 的比例应该很高。因为似乎主线程更耗时。 不管怎样,如果你的 jvm 表现得这样,也没什么可责备的。无论如何,线程执行顺序都不受标准的保障。

    【讨论】:

      【解决方案5】:

      只需在循环中添加一秒的延迟,如下所示:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        相关资源
        最近更新 更多