我有一个函数,其输出由多个线程处理(在函数调用发生后创建)。但是当我运行程序时,我在函数运行完成之前从线程收到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)
答案 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);
超时表示您的某个线程没有在给定时间内执行。