0

Javaでマルチスレッドの概念を学ぼうとしています。コードスニペットの実行中にエラーが発生します。

私のコードスニペット:

class ThreadDemo {
public static void main(String args[]) {
   try{

   int [] arr = new int[10] ;
      for(int i = 0 ; i < 10 ; i++)
         arr[i] = i ;

   for(int c =0 ; c < 2 ; c++){
         for(int i = 0 ; i < 3 ; i++) //I want to run it on one thread
             System.out.println(arr[i]);
         for(int j = 0 ; j < 5 ; j++)  //I want to run it on another thread
             System.out.println(arr[j]);
            }

} catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
   }
}

今、これを解決するために私は試しました、

class ThreadDemo {
public static void main(String args[]) {
try{

int [] arr = new int[10] ;
for(int i = 0 ; i < 10 ; i++)
arr[i] = i ;

    for(int c =0 ; c < 2 ; c++){
         Thread thread1 = new Thread () {
         public void run () {
         for(int i = 0 ; i < 3 ; i++) //I want to run it on one thread
           System.out.println(arr[i]);}
          };

          Thread thread2 = new Thread () {
          public void run () {
          for(int j = 0 ; j < 5 ; j++) //I want to run it on one thread
           System.out.println(arr[j]);}
          };


         }

} catch (Exception e) {
        System.err.println("Error: " + e.getMessage());
    }
   }
}

しかし、エラーが発生します。誰かがこれを解決する方法を教えてもらえますか?

4

2 に答える 2

2

for (int c = 0; c < 2; c++) {
    Thread thread1 = new Thread() {//<- here

Threadクラスを拡張する匿名の内部クラスを作成しています。匿名の内部クラスは、作成されたメソッドのローカル変数にのみアクセスできるfinalことを知っておく必要があります。そのため、アクセスしたい場合は、次int [] arrのように最終的にする必要があります。

final int[] arr = new int[10];

また、スレッドを作成しましたが、開始しませんでした。start()これを行うには、のようなメソッドを呼び出しthread1.start()ます。


メソッドのローカル変数をfinalとして宣言したくない場合は、スレッドを匿名の内部クラスとしてではなく、たとえば個別のクラスとして作成することを検討する必要があります。

class MyThread extends Thread {
    int[] array;
    int iterations;

    public MyThread(int[] arr, int i) {
        array=arr;
        iterations = i;
    }

    @Override
    public void run() {
        for (int i = 0; i < iterations; i++)
            System.out.println(array[i]);
    }
}

class ThreadDemo {
    public static void main(String args[]) {
        try {

            int[] arr = new int[10];
            for (int i = 0; i < 10; i++)
                arr[i] = i;

            for (int c = 0; c < 2; c++) {
                MyThread thread1 = new MyThread(arr, 3);
                MyThread thread2 = new MyThread(arr, 5);
                thread1.start();
                thread2.start();
            }

        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}
于 2012-07-30T00:01:54.487 に答える
0

参考:スレッドに追加のロジックを実際に提供していない場合は、スレッドを拡張することは最善の方法ではありません。Runnableを使用して、スレッドコンストラクターに渡すのが最善です。

Thread t = new Thread(new Runnable() {
    public void run() {
    }
});
t.start();

それとは別に、他の誰かが指摘したように、匿名クラスに直接ある変数はすべて、finalとして宣言する必要があります。

于 2012-07-30T04:57:08.587 に答える