Java 无法访问类型为的封闭实例。

Java 无法访问类型为的封闭实例。,java,multithreading,thread-safety,static-methods,Java,Multithreading,Thread Safety,Static Methods,整个守则是: public class ThreadLocalTest { ThreadLocal<Integer> globalint = new ThreadLocal<Integer>(){ @Override protected Integer initialValue() { return new Integer(0); } }; public class MyT

整个守则是:

public class ThreadLocalTest {
    ThreadLocal<Integer> globalint = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return new Integer(0);
        }
    };


    public class MyThread implements Runnable{
        Integer myi;
        ThreadLocalTest mytest;

        public MyThread(Integer i, ThreadLocalTest test) {
            myi = i;
            mytest = test;
        }

        @Override
        public void run() {
            System.out.println("I am thread:" + myi);
            Integer myint = mytest.globalint.get();
            System.out.println(myint);
            mytest.globalint.set(myi);
        }
    }


    public static void main(String[] args){
        ThreadLocalTest test = new ThreadLocalTest();
        new Thread(new MyThread(new Integer(1), test)).start();
    }
}
导致以下错误:

无法访问ThreadLocalTest类型的封闭实例。必须符合以下条件: 使用ThreadLocalTest类型的封闭实例进行分配(例如x.new A() 其中x是ThreadLocalTest的实例)


核心问题是: 我想在静态方法中初始化内部类。 以下是两种解决方案:

  • 使内部类成为外部类

  • 使用外部引用,如:


  • 新线程(test.new MyRunnable(test)).start()//使用测试对象创建新的

    因为
    MyThread
    是一个内部类,您必须使用
    MyThreadTest
    的实例来访问它:

    public static void main(String args[]) {
        MyThreadTest test = new MyThreadTest();
        new Thread(test.new MyThread(new Integer(1),test)).start();
    }
    

    如果将class
    MyThread
    更改为静态,则可以消除该问题:

    public static final class MyThread implements Runnable
    

    由于您的
    main()
    方法是静态的,因此如果不先创建封闭类的实例,就不能依赖封闭类的非静态类型或字段。不过,更好的方法是甚至不需要这样的访问,这是通过使所讨论的类保持静态来实现的。

    什么错误?我看你刚刚将代码重新粘贴为错误
    public static final class MyThread implements Runnable