0

所以我正在编写一个简单的线程来将两个向量相加,它需要 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

您不能args在课堂外使用main
请不要使用Vector,因为它是ArrayList.
您可以做的是在您的thread类中添加成员变量 asint NoOfThreads并在构造时设置它并thread class在您的run().

于 2013-03-10T18:49:28.103 回答
0

几点注意事项:

  1. 您的添加代码使用嵌套循环。我想那不是本意。为了对两个向量求和,一个循环就足够了。
  2. main(..)中,您没有正确等待线程终止。“结束时间:...”将在您启动线程后立即打印。使用Thread.join().
  3. 您没有使用输入中的线程数。您总是创建并启动 3 个线程。与向量长度相同。它不会传递给线程。
  4. 考虑为每个线程添加一些唯一的 id,以便在它们打印到控制台时可以区分它们。
  5. 正如其他人提到的,代码甚至无法编译。使其首先编译(vectorLength未声明,args在使用范围内未知等)
于 2013-03-10T18:50:24.603 回答
0

我在这里看到两个编译问题。

首先,VectorLength没有定义的类型。我认为应该是int VectorLength

其次,您试图访问似乎不可用args的类中的参考。Vector

如果要argsVector类中使用,可以将 this 作为参数传递给Vector构造函数并将其存储为字段。像这样的东西:

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 不会有问题,因为 Vector 不是 Java 中的保留关键字,并且由于您没有使用 <>-><> 的 Vector 类,因此不会有问题。

我能看到的唯一问题是这段代码

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

您正尝试同时初始化两个变量 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 回答
0

您的代码中有太多东西被破坏了。这里有几个。

  1. 您在 main 之外使用 args。(将其设置为 Vector 类的属性并在对象创建期间对其进行初始化)
  2. Vector 工作正常,但使用不同的类名是有意义的
  3. 一个文件中只能有一个公共类。(将 Vector 放在不同的文件中或删除公共文件)
  4. 为什么需要命令行中的向量大小和线程数?您的矢量大小和胎面计数是静态的(预定义的)。
  5. 如果您尝试从给定大小动态创建向量并从线程大小运行线程,那么需要对您的代码进行很多更改。

我建议在执行此任务之前开始进行更简单的编程练习。

于 2013-03-10T19:19:25.873 回答