下面的代码引发nullpointer异常由于未初始化的外部成员变量而导致。 它在可运行变量的运行方法中抛出NPE。我已经在newFixedThreadPool方法中初始化了ConcurrentLinkedQueue类型的本地变量,并调用了参数化构造函数来初始化可运行成员变量。
顺便说一句,当我直接初始化可运行变量而不创建任何本地变量代码时,就会成功运行。
任何人都可以解释一下
import java.util.concurrent.ConcurrentLinkedQueue;
public class MyExecuterService {
private ConcurrentLinkedQueue<Runnable> runnables;
//private AtomicBoolean execute=AtomicBoolean.true;
private PoolWorkerThread poolWorkerThreads[];
public MyExecuterService()
{}
public MyExecuterService(ConcurrentLinkedQueue<Runnable> runnables,PoolWorkerThread poolWorkerThreads1[])
{
this.runnables=runnables;
poolWorkerThreads=poolWorkerThreads1;
}
private class PoolWorkerThread extends Thread{
@Override
public void run() {
while(true) {
System.out.println(runnables.size()+"runnable"+runnables);
synchronized (runnables) {
if(runnables.size()==0)
{
try {
runnables.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else
{
Runnable task=runnables.poll();
task.run();
//notify();
}
}
}
}
}
public MyExecuterService newFixedThreadPool(int i)
{
ConcurrentLinkedQueue<Runnable> runnableQueue= new ConcurrentLinkedQueue<Runnable>();
PoolWorkerThread [] threads= new PoolWorkerThread[i];
for (int j = 0; j < i; j++) {
threads[j]= new PoolWorkerThread();
threads[j].start();
}
return new MyExecuterService(runnableQueue, threads);
}
public void execute(Runnable runnable) {
System.out.println(runnables.size());
synchronized(runnables)
{
runnables.add(runnable);
runnables.notify();
}
}
public ConcurrentLinkedQueue<Runnable> getRunnables() {
return runnables;
}
public void setRunnables(ConcurrentLinkedQueue<Runnable> runnables) {
this.runnables = runnables;
}
}
答案 0 :(得分:1)
NullPointerException
是由于MyExecuterService
的数据成员未初始化。
您在MyExecuterService
方法中使用参数创建了new FixedThreadPool(int i)
对象,但是由于此方法属于MyExecuterService
本身,因此,要访问此方法,您必须创建一个{{1} }对象。
然后只有您可以访问该对象。
现在由于使用空参数构造函数创建MyExecuterService
对象而发生异常,因此不会初始化数据成员。
只需检查正在通过哪个对象调用MyExecuterService
方法,并确保使用参数化构造函数创建该对象。
顺便说一句,您对the newFixedThreadPool(int i)
类的设计是一种假设。