Java中的线程和命令行参数

时间:2013-03-10 18:33:03

标签: java multithreading

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

        }
}

}

5 个答案:

答案 0 :(得分:0)

您无法在args课程之外使用main 请不要使用Vector,因为它是ArrayList的实现 您可以做的是将成员变量添加到threadint NoOfThreads并在构建thread class时设置它并在run()中使用它。

答案 1 :(得分:0)

一些注意事项:

  1. 您的添加代码使用嵌套循环。我认为那不是 意向。为了对两个向量求和,一个循环就足够了。
  2. main(..)中,您没有正确等待线程 终止。 “结束时间:...”将在您之后立即打印 启动线程。使用Thread.join()
  3. 您没有使用输入中的线程数。你一直 创建并启动3个线程。与矢量长度相同。不是 传递到线程。
  4. 考虑为每个帖子添加一些唯一ID,以便您可以 在打印到控制台时区分它们。
  5. 正如其他人提到的,代码甚至都没有编译。让它编译 第一个(vectorLength未声明,args未知范围在哪里 它已被使用等。)

答案 2 :(得分:0)

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

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

其次,您正试图访问args类中的Vector引用,该引用似乎不可用。

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

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

然后,您应该从Addition类中使用此重载的构造函数:

Thread v1 = new Vector(args);
Thread v2 = new Vector(args);

答案 3 :(得分:0)

将类创建为Vector不会有问题,因为Vector不是Java中的保留关键字,因为您没有使用&lt;&gt; - &gt;&lt;&gt;的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的主方法中。

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

尝试自己解决这两个问题。一切顺利。

答案 4 :(得分:0)

代码中有太多东西坏了。 这里很少。

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