0

そこで、2 つのベクトルを加算する単純なスレッドを作成しています。これには、ベクトルの長さとスレッド数の 2 つのコマンド ライン引数が必要です。私が理解していることから、プログラムはこれら2つの引数を取り、それらに従ってベクトルを合計し、スレッドの数とベクトルの長さに応じてパフォーマンスを示すことになっています。これは私が立ち往生しているところです。これまでのところ、配列を使用して 2 つのベクトルを加算し、時間を表示するスレッドを作成する基本的なコードを作成しましたが、コマンド ライン引数を使用して実装するのに問題があります。これが私がこれまでに行ったことです。

      public class Addition 
      {

         public static void main(String args[])
         {
        int NoOfThreads = Integer.parseInt(args[0]);
        VectorLength = Integer.parseInt(args[1]);

        System.out.println("Start time: " + System.nanoTime());//print start time
        Thread v1 = new Vector();
        Thread v2 = new Vector();
        Thread vsum = new Vector();


        //start all threads
        v1.start();    
        v2.start();    
        vsum.start();
        //vsum2.start();
        System.out.println("End time: " + System.nanoTime());//print end time
     }

  }

  public class Vector extends Thread
  {    


//create vectors and assign them arbitrary values
int v1[] = {12,13,14,15,16,17,18}; 
int v2[] = {15,19,20,22,24,26,28};

//initialise the vector sums to zero
int vsum = 0;
public void run()
{
        //loop to add up the elements of the first vector
        if(Integer.parseInt(args[0])> 0 )
        {
            for(int i = 0; i < v1.length; i++)
            {
                 for(int j=0; j<v2.length; j++)
                 {       
                    vsum = v1[i]+ v2[j];
                    System.out.println("Current total of vector 1: " + vsum);
                    try
                    {
                        System.out.println(System.nanoTime());
                        Thread.sleep(100);
                    }
                    catch (InterruptedException e)
                       {}           
                 }//for
            }

        }
}

}

4

5 に答える 5

0

コードに壊れているものが多すぎます。ここにいくつかあります。

  1. mainの外部でargsを使用しています。(Vectorクラスの属性として設定し、オブジェクトの作成中に初期化します)
  2. Vectorは正常に機能しますが、別のクラス名を使用するのは理にかなっています
  3. 1つのファイルに含めることができるパブリッククラスは1つだけです。(Vectorを別のファイルに入れるか、publicを削除します)
  4. コマンドラインからのベクトルサイズとスレッド数が必要なのはなぜですか?ベクトルサイズとトレッドカウントは静的です(事前定義されています)。
  5. 指定されたサイズからベクトルを動的に作成し、スレッドサイズからスレッドを実行しようとしている場合は、コードに多くの変更を加える必要があります。

このタスクに進む前に、もっと謙虚なプログラミング演習を始めることをお勧めします。

于 2013-03-10T19:19:25.873 に答える
0

クラスargs外での使用はできません。の実装 なので使用しないでください。 あなたができることは、あなたのクラスにメンバー変数を追加し、構築中にそれを設定し、あなたの.main
VectorArrayList
threadint NoOfThreadsthread classrun()

于 2013-03-10T18:49:28.103 に答える
0

いくつかのメモ:

  1. 追加コードはネストされたループを使用しています。そのつもりはなかったと思います。2 つのベクトルを合計するには、1 つのループで十分です。
  2. ではmain(..)、スレッドが終了するのを適切に待機していません。「終了時間:...」は、スレッドを開始した直後に出力されます。を使用しThread.join()ます。
  3. 入力でスレッド数を使用していません。常に 3 つのスレッドを作成して開始します。ベクトルの長さと同じです。スレッドには渡されません。
  4. コンソールに出力するときにそれらを区別できるように、スレッドごとに一意の ID を追加することを検討してください。
  5. 他の人が述べたように、コードはコンパイルさえしません。最初にコンパイルしてください(vectorLength宣言されていない、args使用されているスコープが不明など)。
于 2013-03-10T18:50:24.603 に答える
0

ここでは、コンパイルの問題が 2 つあります。

まず、 の型がVectorLength定義されていません。あるべきだと思いますint VectorLength

次に、利用できないと思われるクラスargsの参照にアクセスしようとしています。Vector

クラスで使用する場合argsは、これを引数としてコンストラクターに渡し、フィールドとして格納できます。このようなもの:VectorVector

public Vector(String[] args) {
    this.args = args;
}

そして、Additionクラスから、このオーバーロードされたコンストラクターを使用する必要があります。

Thread v1 = new Vector(args);
Thread v2 = new Vector(args);
于 2013-03-10T18:50:24.750 に答える
0

Vector は Java の予約済みキーワードではなく、<>-><> の Vector クラスを使用していないため、Vector としてクラスを作成しても問題ありません。

私が見ることができる唯一の問題は、このコードにあります

int NoOfThreads = Integer.parseInt(args[0]);
VectorLength = Integer.parseInt(args[1]);

2 つの変数 NoOfThreads と VectorLength を同時に初期化しようとしていますが、その間のステートメントをセミコロンで終了しています。

int NoOfThreads = Integer.parseInt(args[0])**,**
    VectorLength = Integer.parseInt(args[1]);

セミコロンの代わりにコンマがあることに注意してください。

次に、Vector クラスの run メソッドで args[0] にアクセスしようとしていますが、args 配列のスコープは Addition の main メソッドにあります。

if(Integer.parseInt(args[0])> 0 )

両方の問題を自分で解決してみてください。ではごきげんよう。

于 2013-03-10T18:54:17.737 に答える