Java Runnables在调用之前就开始运行

时间:2013-09-26 20:22:49

标签: java multithreading runnable

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

2 个答案:

答案 0 :(得分:1)

  

有没有人知道为什么两个线程在它们各自的start()调用方法之前启动?

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

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

new Throwable().printStackTrace();

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

答案 1 :(得分: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);

超时表示您的某个线程没有在给定时间内执行。