内部 class 无法访问外部 class 成员变量,该变量是从内部调用构造函数的方法初始化的
Inner class not able to access outer class member variable which is initialized from a method which internally calls constructor
下面的代码由于未初始化的外部成员变量而抛出空指针异常。
它在 运行 方法中为 运行nable 变量抛出 NPE。我已经在 newFixedThreadPool 方法中初始化了 ConcurrentLinkedQueue 类型的本地变量,并调用了参数化构造函数来初始化 运行nable 成员变量。
顺便说一句,当我直接初始化 运行nable 变量而没有成功创建任何局部变量代码 运行s 时。
谁能解释一下
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;
}
}
NullPointerException
是因为MyExecuterService
的数据成员没有初始化。
您在 new FixedThreadPool(int i)
方法中使用参数创建了 MyExecuterService
对象,但是由于此方法属于 MyExecuterService
本身,因此要访问此方法您必须创建一个 MyExecuterService
对象。
然后只有您可以访问该对象。
现在由于使用空参数构造函数创建 MyExecuterService
对象而发生异常,因此数据成员未被初始化。
只需检查您通过哪个对象调用 the newFixedThreadPool(int i)
方法并确保该对象是使用参数化构造函数创建的。
顺便说一句,你的 MyExecuterService
class 的设计是一种假设。
下面的代码由于未初始化的外部成员变量而抛出空指针异常。 它在 运行 方法中为 运行nable 变量抛出 NPE。我已经在 newFixedThreadPool 方法中初始化了 ConcurrentLinkedQueue 类型的本地变量,并调用了参数化构造函数来初始化 运行nable 成员变量。
顺便说一句,当我直接初始化 运行nable 变量而没有成功创建任何局部变量代码 运行s 时。
谁能解释一下
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;
}
}
NullPointerException
是因为MyExecuterService
的数据成员没有初始化。
您在 new FixedThreadPool(int i)
方法中使用参数创建了 MyExecuterService
对象,但是由于此方法属于 MyExecuterService
本身,因此要访问此方法您必须创建一个 MyExecuterService
对象。
然后只有您可以访问该对象。
现在由于使用空参数构造函数创建 MyExecuterService
对象而发生异常,因此数据成员未被初始化。
只需检查您通过哪个对象调用 the newFixedThreadPool(int i)
方法并确保该对象是使用参数化构造函数创建的。
顺便说一句,你的 MyExecuterService
class 的设计是一种假设。