繁体   English   中英

Java和命令行参数中的线程

[英]Threads in Java and command line arguments

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

        }
}

}

您不能在main类之外使用args
请不要使用Vector因为它是ArrayList的实现。
您可以做的是将成员变量int NoOfThreads添加到thread类中,并在构造thread classint NoOfThreads进行设置,并在run()使用它。

一些注意事项:

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

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

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

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

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

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

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

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

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

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

您的代码中有太多坏处。 这里有几个。

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

我建议在执行此任务之前先进行一些谦虚的编程练习。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM