2013-03-10 3 views
0

두 개의 벡터를 함께 추가하는 간단한 스레드를 작성 중이며 두 개의 명령 줄 인수 (벡터 길이 및 스레드 수)가 필요합니다. 내가 이해하는 것으로부터, 프로그램은이 두 가지 인자를 받아 들여 스레드와 벡터 길이의 수에 따라 성능을 나타내는 벡터를 합산합니다. 이것은 내가 붙어있는 곳이다. 지금까지 배열을 사용하여 두 벡터를 함께 추가하고 스레드를 생성하여 시간을 표시하는 기본 코드를 작성했지만 명령 줄 인수로 구현하는 데 문제가 있습니다. 여기까지 제가 한 일이 있습니다.Java 스레드 및 명령 줄 인수

 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 
      } 

     } 
} 

}

+0

'Vector'는 이미 클래스 이름 ('java.util.Vector')입니다. 'VectorThread'와 같은 다른 이름을 선택하는 것이 가장 좋습니다. – wchargin

+0

'Vector' 클래스에서'args' 란 무엇입니까? –

+0

오 그게 명령 줄 인수를 사용하여 실행 스레드 수를 읽으려고 시도한 것입니다. – user2035796

답변

0

몇 가지 참고 사항 :

  1. 귀하의 추가 코드는 중첩 루프를 사용합니다. 나는 이것이 의도 된 것이 아니라고 생각한다. 두 개의 벡터를 더하기 위해 하나의 루프만으로 충분합니다.
  2. main(..)에서 의 스레드가 제대로 종료 될 때까지 기다리지 않습니다. 스레드를 시작한 직후 "종료 시간 : ..."이 인쇄됩니다. Thread.join()을 사용하십시오.
  3. 입력의 스레드 수를 사용하고 있지 않습니다. 항상 3 개의 스레드를 만들고 시작하십시오. 벡터 길이와 동일합니다. 스레드에 전달 된 것은 이 아닙니다.
  4. 스레드 당 고유 ID를 추가하여 콘솔에 인쇄 할 때 을 구분할 수 있습니다.
  5. 다른 언급했듯이 코드는 컴파일되지 않습니다. 그것이 내가 여기에 두 가지 컴파일 문제를 참조
0

당신은 main 클래스 외부 args을 사용할 수 없습니다.
ArrayList의 구현이므로 Vector을 사용하지 마십시오.
thread 클래스에 멤버 변수를 int NoOfThreads으로 추가하고 thread class을 구성하는 동안 변수를 설정하고 run()에 사용하면됩니다.

0

(이 사용되는 범위 등에 알 수없는 선언되지 vectorLength, args) 첫 를 컴파일합니다.

우선, VectorLength의 유형은 정의되지 않습니다. 나는 그것이 int VectorLength이어야한다고 생각한다.

두 번째로 Vector 클래스에있는 args 참조에 액세스하려고 시도하고 있는데 사용하지 않는 것 같습니다.

Vector 클래스에서 args을 사용하려는 경우이 값을 Vector 생성자의 인수로 전달하여 필드로 저장할 수 있습니다.이런 식으로 뭔가 : 벡터에서 예약 된 키워드 아니기 때문에 문제가되지 않습니다 벡터와 같은 클래스를 생성

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

:

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

그리고

Addition 클래스에서 당신이 다음이 오버로드 된 생성자를 사용한다 Java, 그리고 <> -> <의 Vector Class를 사용하지 않으므로 문제가되지 않습니다. 내가 볼 수

유일한 문제는 당신은 같은 시간에 두 개의 변수 NoOfThreads 및 VectorLength를 초기화하려고하지만, 세미콜론 사이에 문을 종료 한

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

이 코드입니다.

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

세미콜론이 쉼표로 표시됩니다.

둘째, Vector 클래스의 run 메소드에서 args [0]에 액세스하려고하지만 args 배열의 범위가 Addition의 기본 메소드에 있습니다.

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

자신에 모두 문제를 해결하십시오. 모두 제일 좋다.

0

코드에서 너무 많은 것들이 깨졌습니다. 여기에 몇 개가 있습니다.

  1. 주 외부에서 args를 사용하고 있습니다. (Vector 클래스의 속성으로 설정하고 객체를 생성하는 동안 초기화하십시오.)
  2. 벡터가 제대로 작동하지만 다른 클래스 이름을 사용하는 것이 좋습니다.
  3. 파일에는 하나의 공용 클래스 만있을 수 있습니다. (다른 파일에 벡터 삽입 또는 공개 제거)
  4. 왜 벡터 크기와 줄 수를 줄이 필요합니까? 귀하의 벡터 크기와 트레드 카운트는 정적입니다 (사전 정의).
  5. 주어진 크기에서 벡터를 동적으로 만들고 스레드 크기에서 스레드를 실행하려는 경우 코드에 많은 변경이 필요합니다.

이 작업을 시작하기 전에 좀 더 겸손한 프로그래밍 연습을 시작하는 것이 좋습니다.