2016-11-28 643 views
0

當我在start()方法中傳遞參數時,出現錯誤(最後5行)。錯誤說:類型線程中的方法start()不適用於參數(int)。什麼是正確的做法?(Java多線程)如何在多線程中傳遞參數?

該程序是關於使用Java中的多線程打印奇數/偶數。

import java.util.Scanner; 

class odd extends Thread 
{ 
public void run(int y){ 
    System.out.println("Odd numbers are:"); 
    for (int i=0;i<=y;i++) 
    { 
     if (i%2!=0) 
     { 
      System.out.println(i); 
     } 
    } 
} 
} 

class even extends Thread{ 

public void run(int x) 
{ 
    System.out.println("Even Numbers are"); 
    for (int i=0; i<=x; i++) 
    { 
     if (i%2==0) 
     { 
      System.out.println(i); 
     } 
    } 
} 

} 


    class Star{ 
public static void main(String[] args) 
{ 
    System.out.println("Enter No. upto which even-odd should be printed"); 
    Scanner var=new Scanner(System.in); 
    int vary= var.nextInt(); 

    odd money=new odd(); 
    even honey=new even(); 

    money.start(vary); 

    Thread.sleep(5000); 
    honey.start(vary); 

} 
} 
+3

通常我會在構造函數中傳遞任何需要的參數,然後調用'start()'。 – markspace

+0

你應該聲明'jo'和'yo',因爲你想初始化它們(請把大寫字母放到你的類名上,看看駝峯表示法。 – AxelH

+0

改變'yo'的構造函數來接受整數 –

回答

2

有在你的程序的語法和邏輯錯誤:

我已經糾正你的代碼。以下代碼是使用Java中的多線程打印奇數/偶數的正確代碼。

class jo extends Thread { 
    private int number; 

    jo(int number) { 
     this.number = number; 
    } 

    @Override 
    public void run() { 
     System.out.println("Odd numbers are:"); 
     for (int i = 0; i <= number; i++) { 
      if (i % 2 != 0) { 
       System.out.println(i); 
      } 
     } 
    } 
} 

class yo extends Thread { 

    private int number; 

    yo(int number) { 
     this.number = number; 
    } 

    @Override 
    public void run() { 
     System.out.println("Even Numbers are"); 
     for (int i = 0; i <= number; i++) { 
      if (i % 2 == 0) { 
       System.out.println(i); 
      } 
     } 
    } 

} 
import java.util.Scanner; 

class Star { 
    public static void main(String[] args) throws InterruptedException { 
     System.out.println("Enter No. upto which eve-od should be printed"); 
     Scanner var = new Scanner(System.in); 
     int vary = var.nextInt(); 
     jo money = new jo(vary); 
     yo honey = new yo(vary); 

     money.start(); 
     Thread.sleep(5000); 
     honey.start(); 

    } 

} 

更正完成:

  1. 在課堂上星,當你創建類祚

2.To實現多線程的對象有一個語法錯誤,你需要重寫線程類的運行方法。 run方法的正確簽名是public void run() { //logical code will go here } run方法不接受任何輸入參數。

3.要開始執行線程,您需要調用Thread類的start方法。它看起來像public void start()。 start方法不接受任何輸入參數。

4.我已經在jo和yo類的代碼中進行了邏輯修正。使用%運算符來檢查給定的數字是偶數還是奇數。 %運算符返回餘數,如果當數除以2時餘數爲零,則表示它是偶數,否則它是奇數。

您可以運行共享代碼來檢查輸出。

快樂編碼!

+0

感謝您的回答。它是完美的。 – YoMama

3

標準的方式做,這是

  1. 在線程類中聲明的一個或多個成員變量來保存參數
  2. 在線程類中聲明構造函數接收並存儲這些參數
  3. 傳遞的參數時實例線程類

對於你的例子:

class Jo extends Thread 
{ 
    int var; 
    public Jo(int var) { 
     this.var = var; 
    } 
    public void run(int y) { 
     // some code using this.var 
     ... 
    } 
} 

... 

Jo money = new Jo(vary); 
money.start(); 
+1

請注意同步問題。 – Gladclef

1

程序中有很多錯誤。我正在指出他們。

  1. 錯別字爲 - jo=moneyjo money = new jo(); money.stary(vary);money.start();

  2. 邏輯是錯誤的:要檢查數是偶數或奇數,我們必須由2檢查除法運算的餘數是0或不。相反,你檢查了商數。假設4,所以4/2 = 2,並且!= 0,所以代碼會認爲它是一個奇數。

    現在,如果它是a%b == 0,它將以這種方式工作,4%2 = 0,因此均勻。

  3. Thread.start()不帶任何參數,所以你必須創建一個類的構造函數來傳入限制。

我已經修改了代碼:

import java.util.Scanner; 

class jo extends Thread 
{ 
    private int limit; 

    public jo(int limit) 
    { 
     this.limit = limit; 
    } 

    public void run() 
    { 
     System.out.println("Odd numbers are"); 

     for (int i = 0 ; i <= limit ; i++) 
     { 
      if (i%2 != 0) 
      { 
       System.out.println(i); 
      } 
     } 
    } 
} 

class yo extends Thread 
{ 
    private int limit; 

    public yo(int limit) 
    { 
     this.limit = limit; 
    } 

    public void run() 
    { 
     System.out.println("Even Numbers are"); 

     for (int i = 0 ; i <= limit ; i++) 
     { 
      if (i%2 == 0) 
      { 
       System.out.println(i); 
      } 
     } 
    } 
} 


class TestProject 
{ 
    public static void main(String[] args) throws InterruptedException 
    { 
     System.out.println("Enter No. upto which eve-od should be printed"); 
     Scanner var = new Scanner(System.in); 
     int vary = var.nextInt(); 
     jo money = new jo(vary); 
     yo honey = new yo(5vary); 

     money.start(); 
     Thread.sleep(5000); 
     honey.start(); 

    } 
} 

我希望這將幫助你。

P.S. :請檢查你的命名約定。這對其他人來說是很難理解的。

+0

我們是否允許在run()方法內使用limit(變量)?因爲limit(變量)是在該方法之外聲明的 – YoMama

+0

它是在類的範圍內聲明的,它使得它可以通過(yo和jo),你可以在該類的任何方法中使用它,最好的做法是將變量le @Reena Upadhyay提到的私人話題。這是一個非常好的習慣。所以把'int limit'設爲'private int limit' –

+0

@YoMama:有沒有什麼特別的理由讓我的答案在接受一次後不可接受?請告訴我,您取消接受的代碼是否有任何錯誤,或者是否有其他原因。謝謝。 –