【问题标题】:Java Runnables start running before they are calledJava Runnable 在被调用之前就开始运行
【发布时间】:2013-09-26 20:22:49
【问题描述】:

我有一个函数,其输出由多个线程处理(在函数调用发生后创建)。但是当我运行程序时,我会在函数完成运行之前从线程收到 NullPointerException。如何指定 Java 不提前启动线程?

public class MainThread extends Thread {
    public MainClass() {
    ...
    myRunnable1 = new myRunnable(args[]);
    myRunnable2 = new myRunnable(args[]);
    ...
    }
    public void run() {
        for (someNumberOfRuns) {
            function1();
            System.out.println("Done");
            thread1 = new Thread(myRunnable);
            thread2 = new Thread(myRunnable);
            thread1.start();
            thread2.start();
            ...
        }
     }
}

在 for 循环的第一次迭代中,thread1 和 thread2 都会抛出 NullPointException 错误,然后系统将打印出“Done”。有谁知道为什么这两个线程在方法中各自的 start() 调用之前启动? 谢谢。 (Java版本为1.6u26)

【问题讨论】:

  • 请张贴实际的相关代码和你如何运行它的例子,即。带参数。
  • > "for (someNumberOfRuns) {" 不解析为 Java 代码。请再试一次。
  • 不要扩展 Thread,而应该实现 Runnable 以避免混淆。你能发布编译和演示问题的真实代码吗?
  • 并反馈我的回答。如果对你有帮助,记得接受。

标签: java multithreading runnable


【解决方案1】:

有谁知道为什么这两个线程在方法中各自的 start() 调用之前启动?

这在 Java 下不会发生——如果线程正在启​​动,那么一些代码正在启动它。我怀疑您要么直接在实例化MainThread 的线程中调用run() 方法,要么在您不期望的某个地方调用start()

如果您 use a debugger 并在 run() 方法中放置一个断点以查看是谁调用它,这可能会有所帮助。如果你想使用println 调试,你可以打印出一个异常,显示run() 内部的堆栈跟踪:

new Throwable().printStackTrace();

如果您提供实际实例化 MainThread 的代码,我们或许可以为您提供更多帮助。

【讨论】:

    【解决方案2】:

    如果你问的是如何让一堆线程同时等待启动,

    让每个线程执行一个Runnable,并让run()的第一行是

    barrier.await(LONG_TIMEOUT_MS, TimeUnit.MILLISECONDS);
    

    障碍被定义为

    final CyclicBarrier barrier = new CyclicBarrier(numThreads + 1);
    

    然后,当您准备好让所有这些都开始时,调用

    // Wait for all threads to be ready, then start them all at once
    barrier.await(LONG_TIMEOUT_MS, TimeUnit.MILLISECONDS);
    

    超时表示您的一个线程未在给定时间内执行。

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 1970-01-01
      • 2020-07-27
      • 2019-05-14
      • 2020-10-07
      • 2012-05-10
      • 1970-01-01
      相关资源
      最近更新 更多