-3

我有一个函数,其输出由多个线程处理(在函数调用发生后创建)。但是当我运行程序时,我会在函数完成运行之前从线程收到 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)

4

2 回答 2

1

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

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

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

new Throwable().printStackTrace();

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

于 2013-09-26T20:30:02.203 回答
0

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

让每个线程执行一个 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);

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

于 2013-09-27T04:10:33.680 回答