2016-11-28 1 views
0

Ich bekomme einen Fehler (in den letzten 5 Zeilen), wenn ich einen Parameter in der start() -Methode übergeben. Der Fehler sagt: Methode Start() in Typ Thread ist nicht anwendbar für Argument (Int). Was ist der richtige Weg?(Java Multi threading) Wie übergibt man Parameter in Multithreading?

Dieses Programm ist zum Drucken von ungeraden/geraden Zahlen mit Multi-Threading in 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

Normalerweise übergebe ich alle benötigten Parameter im Konstruktor und rufe dann 'start()' auf. – markspace

+0

Sie sollten 'jo' und' yo' deklarieren, da Sie sie initialisieren möchten (bitte, setzen Sie Großbuchstaben auf Ihre Klassennamen, siehe CamelCase-Notation. – AxelH

+0

Ändern Sie den Konstruktor von 'yo', um die ganze Zahl zu akzeptieren –

Antwort

2

Es gibt syntaktische und logische Fehler in Ihrem Programm:

Ich habe Ihren Code korrigiert. Der folgende Code ist der korrekte Code zum Drucken von geraden/ungeraden Zahlen mit Multi-Threading in 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(); 

    } 

} 

Korrekturen vorgenommen:

  1. In der Klasse Star, es wurde ein Syntaxfehler, wenn Sie ein Objekt der Klasse jo
  2. Erstellen wurden

2.To erreichen Multithreading, müssen Sie override run-Methode der Thread-Klasse. Die korrekte Signatur der run-Methode lautet public void run() { //logical code will go here } run method akzeptiert keine Eingabeargumente.

3.Um die Ausführung des Threads zu starten, müssen Sie die Startmethode der Thread-Klasse aufrufen. Es sieht wie public void start() aus. Die Startmethode akzeptiert keine Eingabeargumente.

4.Ich habe die logische Korrektur in Ihrem Code in Jo und Yo Klasse vorgenommen. Verwenden Sie den Operator%, um zu überprüfen, ob eine gegebene Zahl gerade oder ungerade ist. Der Operator% gibt den Rest zurück, wenn ein Rest null ist, wenn eine Zahl durch 2 geteilt wird, bedeutet dies, dass es eine gerade Zahl ist, andernfalls ist es ungerade.

Sie können freigegebenen Code ausführen, um die Ausgaben zu überprüfen.

Glückliche Codierung!

+0

Danke für die Antwort. Es funktioniert perfekt. – YoMama

3

Der normale Weg, dies zu tun ist, um

  1. eine oder mehr Elementvariablen in der Thread-Klasse deklarieren Parameter zu halten
  2. einen Konstruktor in der Thread-Klasse erklären, diese Parameter zu empfangen und speichern
  3. passieren die Parameter, wenn der Faden Klasse
Instanziieren

Für Ihr Beispiel:

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

Seien Sie vorsichtig bei Synchronicity Fragen Elementvariable in einem synchronisierten Block – Gladclef

1

viele Fehler im Programm sind. Ich zeige sie auf.

  1. Typos für - jo=money wird jo money = new jo(); money.stary(vary);money.start(); sein

  2. Logik ist falsch: für eine Reihe Um zu überprüfen, gerade oder ungerade zu sein, die wir von 2 zu sein, den Rest der Division Betrieb überprüfen müssen 0 oder nicht. Stattdessen haben Sie den Quotienten überprüft. Nehmen Sie 4, also 4/2 = 2 und! = 0 an, damit der Code sie als ungerade Zahl betrachtet.

    Nun, wenn es a%b == 0 ist, wird es so funktionieren, 4% 2 = 0, also sogar.

  3. Thread.start() akzeptiert keinen Parameter, daher müssen Sie einen Konstruktor der Klasse erstellen, um die Grenzwerte zu übergeben.

Ich habe den Code wie folgt geändert:

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(); 

    } 
} 

Ich hoffe, das Ihnen helfen wird.

P.S. : Bitte überprüfen Sie Ihre Namenskonventionen. Es wird für andere wirklich schwierig sein zu verstehen.

+0

Darf limit (Variable) innerhalb der Methode run() verwendet werden? Wie limit (Variable) außerhalb dieser Methode deklariert wird – YoMama

+0

Sie wird innerhalb des Gültigkeitsbereichs der Klasse deklariert, über die sie zugänglich ist out the ganze Klasse (yo und jo). Sie können es in allen Methoden innerhalb dieser Klasse verwenden. Best Practice ist die Variable zu machen le dekraled als privat wie von @Reena Upadhyay erwähnt. Es ist eine sehr gute Angewohnheit. also mache 'int limit' als 'private int limit' –

+0

@YoMama: Gab es einen bestimmten Grund, meine Antwort nicht akzeptabel zu machen, nachdem ich sie einmal akzeptiert habe? Bitte sagen Sie mir, ob etwas in dem Code falsch ist, für den Sie die Annahme storniert haben oder einen anderen Grund haben. Vielen Dank. –