2

メイン メソッドで Runnable インターフェイスを実装し、それらのオブジェクトをスレッド プールに渡すクラスのオブジェクトを作成しようとしています。しかし、IDE は非静的変数を読み取るエラーを表示します。これは静的コンテキストから参照できません。つまり、そもそもオブジェクトを作成できませんでした。このコードの何が問題なのか、私にはわかりませんでした。他のすべては正常に動作しますが、このコード行だけがコンパイル エラーを示しています。誰か助けてくれませんか??

package threads;

import java.util.concurrent.*;

public class Tut5 {

    public static void main(String[] args) {

        ExecutorService exe = Executors.newFixedThreadPool(2);

        for(int i=0; i<5; i++) {
            Runner5 r5 = new Runner5(i);
            exe.submit(r5);
        }

        exe.shutdown();

        System.out.println("All tasks submitted.");

        try {
            exe.awaitTermination(1, TimeUnit.DAYS);
        }
        catch(InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("All tasks completed.");
    }

    class Runner5 implements Runnable {

        private int id;

        public Runner5(int id) {
            this.id = id;
        }

        public void run() {

            System.out.println("Starting thread: " + id);

            try{
                Thread.sleep(3000);
            }
            catch(InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("Ending thread: " + id);
        }
    }
}

さよなら @jtahlborn

4

4 に答える 4

2

他の人が答えたように、Runner5クラスはの内部クラスですTut5。そのため、インスタンス化するには外部インスタンスが必要です。

Runner5 を静的クラスにすると、外部インスタンスを必要としない静的ネスト クラスになります。

static class Runner5 implements Runnable {
...
}

しかし、他の人が指摘しているように、ネストされたクラスの演習に取り組んでいない限り、またはクラスがクラスTut5と組み合わせてのみ有用であり、参照されるだけであることが確実でない限り、クラスを独自のクラスファイルに配置する必要がありますそのクラスから。

洞察については、http: //docs.oracle.com/javase/tutorial/java/javaOO/nested.htmlを参照してください。

于 2012-04-29T08:11:48.337 に答える
2
  • 非静的変数 これは静的コンテキストから参照できません -

このエラーは、静的メソッドまたはブロックで静的インスタンスまたはメソッドを使用していない場合に発生します。

メインメソッドは静的 であるため、public static void main(String[] args)単純にエラーが発生します。

ここで、class Runner5 implements Runnableクラスは静的メインメソッドでアクセスしている内部クラスであるため、生成されます-

No enclosing instance of type Tut5 is accessible.
Must qualify the allocation with an enclosing instance of type Tut5
(e.g. x.new A() where x is an instance of Tut5).

この内部クラスをクラスから定義するか、これを静的としてTut5マークすることができます。Runner5または、クラスのインスタンスをTut5作成してメソッドを作成し、残りのコードを配置します。

ありがとう

于 2012-04-29T04:17:20.640 に答える
0

ここでの問題は、意図せずに内部クラスを作成したことです。あなたはJavaの初心者のようですが、内部クラスはJavaのかなり高度な機能であるため、当面は回避するのが最善だと思います。

Javaに自信が持てるようになるまでは、各クラスを別々のファイルに入れることをお勧めします。クラスのコードをRunner5別のファイルに移動し、クラスを作成してpublic名前を付けますRunner5.java。次に、コードが正常にコンパイルされることがわかります。

Runner5現状では、コードは作成した各インスタンスに属するクラスを定義しTut5ます。ただし、のインスタンスを作成することはないため、それらに属するをTut5作成することはできません。クラスに修飾子をRunner5追加した場合、内部クラスはこのクラスのインスタンスではなく、クラスに属します。その後、メソッド内からを作成できるようになります。ただし、まだJavaを学習しているので、今のところ、物事を単純に保ち、ファイルごとに1つのクラスのルールに従うことをお勧めします。staticRunner5Runner5Tut5Runner5main

于 2012-04-29T07:28:02.600 に答える
0

最も簡単な解決策は、Runner5クラスを独自のファイルにコピーするだけです。

非常に正当な理由がない限り、この場合にネストされたクラスを使用する必要がある理由はわかりません。(表示したコードでは)何も変更されません。

于 2012-04-29T07:29:00.207 に答える