0

私はすでに数分前にこれに近い別の質問をしており、良い答えがありましたが、それは私が探していたものではなかったので、もう少し明確にしようとしました.

クラスに Thread のリストがあるとしましょう:

class Network {

    private List<Thread> tArray = new ArrayList<Thread>();
    private List<ObjectInputStream> input = new ArrayList<ObjectInputStream>();

    private void aMethod() {
        for(int i = 0; i < 10; i++) {
            Runnable r = new Runnable() {
                public void run() {
                    try {
                        String received = (String) input.get(****).readObject(); // I don't know what to put here instead of the ****
                        showReceived(received); // random method in Network class
                    } catch (IOException ioException) {
                        ioException.printStackTrace();
                    }
                }
            }
            tArray.add(new Thread(r));
            tArray.get(i).start();
        }
    }
}

* *の代わりに何を入力すればよいですか? たとえば、tArray リストの最初のスレッドは、入力リストの最初の入力にのみアクセスする必要があります。

EDIT:私の入力リストにはすでに10個の要素があるとしましょう

4

2 に答える 2

0

を入れるとうまくいきますiObjectInputStreamまた、各スレッドのリストにを追加する必要があります。input.addという目的でのご利用をお勧めします。また、いくつかのスレッドでリストを埋める必要がtArrayあります。そこで再度 add を使用してください。

于 2013-07-19T22:55:51.073 に答える
0

解決策は次のとおりです。

private void aMethod() {
    for(int i = 0; i < 10; i++) {
        final int index = i;  // Captures the value of i in a final varialbe.
        Runnable r = new Runnable() {
            public void run() {
                try {
                    String received = input.get(index).readObject().toString(); // Use te final variable to access the list.
                    showReceived(received); // random method in Network class
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }
        };
        tArray.add(new Thread(r));
        tArray.get(i).start();
    }
}

i各スレッドが入力配列の 1 つの要素にアクセスするようにするには、変数の値をリストへのインデックスとして使用できます。直接使用の問題iは、内部クラスが外側のスコープから非最終変数にアクセスできないことです。これを克服するためiに、 final 変数に代入しますindexindexのコードで最終的にアクセスできますRunnable

追加の修正:

  • readObject().toString()
  • catch(Exception exception)
  • tArray.add(new Thread(r))
于 2013-07-19T23:09:20.330 に答える