6

コード全体は次のとおりです。

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 test=new ThreadLocalTest();
    new Thread(new MyThread(new Integer(1),test)).start();

次のエラーが発生します。

タイプ ThreadLocalTest の囲んでいるインスタンスにアクセスできません。タイプ ThreadLocalTest の囲みインスタンス (x は ThreadLocalTest のインスタンスである xnew A()) で割り当てを修飾する必要があります。


中心的な問題は次のとおりです。静的メソッドで内部クラスを初期化したい。ここに2つの解決策があります:

  1. 内部クラスを外部クラスにする

  2. 次のような外部参照を使用します。

new Thread(test.new MyRunnable(test)).start();//Use test object to create new

4

2 に答える 2

22

クラスMyThreadstaticに変更すると、問題が解消されます。

public static final class MyThread implements Runnable

メソッドは静的であるためmain()、最初に外側のクラスのインスタンスを作成せずに、外側のクラスの非静的型またはフィールドに依存することはできません。ただし、そのようなアクセスを必要としない方がよいでしょう。これは、問題のクラスを静的にすることによって実現されます。

于 2012-09-18T13:22:50.900 に答える
3

MyThreadは内部クラスであるため、次のインスタンスを使用してアクセスする必要がありますMyThreadTest

public static void main(String args[]) {
    MyThreadTest test = new MyThreadTest();
    new Thread(test.new MyThread(new Integer(1),test)).start();
}
于 2012-09-18T07:18:34.053 に答える