0

Javaには、コードがあります:

Graph[] graphs = new Graph[100];
for (int i = 0; i < 100; i++) {
    graphs[i] = new Graph();
    Graph g = graphs[i];
    g.subgraphs = new Graph[100 - i];
    g.leaves = new HashSet<Integer>();
    g.targets = new HashMap<Integer, int[]>(l - i);
    g.weights = new HashMap<Integer, Integer>(l - i);
}

並列コードを書きたい。ここでJavaスレッドの学習を手伝ってくれませんか。だから私はこのコードを追加しました:

Thread[] threads = new Thread[3];
for (int i = 0; i < threads.length; i++) {
    threads[i] = new Thread(new Runnable() {
        public void run() {
            // some code to run in parallel
        }
    });
    threads[i].start();
}

// as far as I understood this waits until threads above are finishing
for (int i = 0; i < threads.length; i++) {
    try {
        threads[i].join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

これで、カスタム オブジェクトを作成するときにループからコードをコピーできますが、Graph何らかの方法でインデックスi( 0to から100) をrun()メソッドに渡す必要があります。

どうやってやるの?

4

3 に答える 3

2

目的がパフォーマンスを最大化することである場合、最善の策は、ほぼ確実にここで並列処理をまったく行わないことです。数百HashMapの s を作成することは、新しいスレッドを開始するよりも確実に安くなります。

于 2013-03-20T00:29:18.023 に答える
1

では、匿名の内部クラスからのJavaみフィールドを参照できるため、インデックスにアクセスするには変数をfinal宣言する必要があります。finalj

Thread[] threads = new Thread[3];
for (int i = 0; i < threads.length; i++) {
  final int j = i;
  threads[i] = new Thread(new Runnable() {
    public void run() {
      // some code to run in parallel
      System.out.println(j);
    }
  });
  threads[i].start();
}
于 2013-03-20T01:27:20.663 に答える
1

マルチスレッドがオブジェクトのインスタンス化に適していないことは承知していますが、個人的にコーディング スキルを練習することをサポートします。試してみて、実際の結果から学んでください。

実際、Java SE 1.5 以降、低レベルのマルチスレッド コードはほとんど使用されていません。並行パッケージが登場するためです。ExecutorExecutorServiceおよびから学ぼうとしCompletionServiceます。

N 個のタスクを並行して実行するおよびjava.util.concurrent.CompletionService についてを参照してください。

于 2013-03-20T01:53:54.607 に答える