内部 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 的设计是一种假设。