0

さて、私はこれに問題を抱えています多分私はあまりにも長い間考えていたか、愚かですが、これが私が持っているものと私がやろうとしていることです:

アップデートコードはすべて、実行の問題を修正しませんでした。

public class myClass program {
   int [] w = null;
   int [] x = null;
   Thread T = null;
   public static void main(String [] args){
    x = new int[5];
    w = new int[5];

 // here i am trying to invoke a new thread passing the index
 // of my array, then incrementing the index each time i create a new thread
 // the purpose is to fill each index each time the new thread runs.

    for(int i = 0; i < w.length; i ++){
      // T = new Thread(new myThreadClass(w[i])); // only passes 0 take this out and 
      T = new Thread( new myThreadClass(i));      // pass i so the position changes
      T.start();
      try{
        Thread.sleep(100);
        }catch(Exception e){}

   }
}

私の別のクラスmyThreadClass.javaには、次のものがあります。

public class myThreadClass extends Thread{
 int [] w = null;
 int position = 0;
 int value = 1;

  public myThreadClass(int p){
    this.position = p
    w = myClass.w;
  }

  @Override
  public void run(){
   // synchronize the thread so there is no memory cache problems
   //
   synchronized(w){
      w[position] = value;
   }
  }

}

myClassからwの出力を出力すると:

私は得るw = 1 0 0 0 0

でも私はしたいw = 1 1 1 1 1

編集済み-正しい出力が得られました-コードに変更がないか確認してください

4

4 に答える 4

2

この部分myThreadClass(w[i])では、インデックスを渡さず、値を渡します。これはw、5つの要素の配列であるため、ゼロです。これらはすべて、デフォルト値の0で初期化されます。

代わりに行う必要がありmyThreadClass(i)ます。

于 2012-10-16T17:44:21.857 に答える
1

w[]最初はすべてZEROです。これらの値の1つをスレッドコンストラクターに渡します

于 2012-10-16T17:49:31.423 に答える
1

myClassからのこの行:

w = new int[5];

wのすべての要素を0に初期化します。

だから、あなたが電話するとき

T = new Thread( new myThreadClass(w[i]));

あなたはこれを効果的に行っています:

T = new Thread( new myThreadClass(0));

したがって、変更されるw[]の唯一の要素は最初の要素です。

于 2012-10-16T17:50:04.370 に答える
0

これがあなたの問題に対する過剰に設計された解決策です。カプセル化せずに問題なく実行できますが、例が読みやすくなるため、これを使用することにしました。

public class Test {
    public static void main(String[] args) {
        // Create the resultset containing the result
        ResultSet resultSet = new ResultSet(5);
        Thread[] threads = new Thread[resultSet.getSize()];

        // Create threads
        for (int i = 0; i < resultSet.getSize(); i++) {
            threads[i] = new Thread(new TestTask(
                    resultSet.createResultSetter(i)));
        }

        // Start threads
        for (int i = 0; i < resultSet.getSize(); i++) {
            threads[i].start();
        }

        // Wait until threads complete
        for (int i = 0; i < resultSet.getSize(); i++) {
            try {
                threads[i].join();
            } catch (InterruptedException exception) {
                // ??!
            }
        }

        // Print the result
        for (int i = 0; i < resultSet.getSize(); i++) {
            System.out.println(resultSet.getResult(i));
        }
    }

    /**
     * Interface used to set the result
     */
    public static interface ResultSetter {
        public void setResult(int result);
    }

    /**
     * Container class for results
     */
    public static class ResultSet {
        private final int[] results;

        public ResultSet(int size) {
            results = new int[size];
        }

        public int getSize() {
            return results.length;
        }

        public ResultSetter createResultSetter(final int position) {
            return new ResultSetter() {
                public void setResult(int result) {
                    ResultSet.this.setResult(position, result);
                }
            };
        }

        public synchronized int getResult(int position) {
            return results[position];
        }

        public synchronized void setResult(int position, int result) {
            results[position] = result;
        }
    }

    /**
     * A task executed by a thread
     */
    public static class TestTask implements Runnable {
        private ResultSetter resultSetter;

        public TestTask(ResultSetter resultSetter) {
            this.resultSetter = resultSetter;
        }

        @Override
        public void run() {
            resultSetter.setResult(1);
        }
    }
}
于 2012-10-16T18:22:29.050 に答える