线程不起作用?

时间:2015-01-26 12:05:13

标签: java

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然后我找不到“运行”字时,那只是很奇怪

enter image description here

5 个答案:

答案 0 :(得分:4)

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

将控制台配置更改为无限缓冲区。enter image description here

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

}