Und Threads public void run()
import java.lang.Thread;
class ThreadExperiment implements Runnable {
public static void main(String[] args) {
Thread t = new Thread(new ThreadExperiment());
@Override
public void run(){
do {
num ++;
try {
Thread.sleep(400);
} catch (InterruptedException e){
}
} while (num >= 0);
}
Thread t2 = new Thread(new ThreadExperiment());
@Override
public void run() {
do {
num2--;
try {
Thread.sleep(400);
} catch (InterruptedException e){
}
} while (num >= 1);
}
int num = 1;
int num2 = 10;
t.start();
t2.start();
if (num == num2) {
t.interrupt();
t2.interrupt();
}
}
}
Versuchen zu basteln mit Gewinde und man dreht sich im Kreis, immer so nah. Ich möchte zwei threads, einer Erhöhung einer Zahl, die andere eine Verringerung einer Zahl zählen. Wenn Sie sich treffen, ich möchte, dass Sie aufhören. Aber ich bin Probleme mit public void run() - im moment, es sagt mir, dass icht have a semi-colon next to both of them. What isn
t rechts? Ist dies der richtige Ort zu setzen public void run()?
Auch, einige websites sagen, ich brauche zwei getrennte Klassen forcreating threads - gibt es einen Grund für dieses? Vielleicht, wenn man threads beruht auf Berechnungen aus der anderen, sondern geht einen anderen Weg, das kann ich verstehen, aber mir fühlt sich anders an, einfach zwei getrennte Entitäten.
Schließlich muss ich die import-Anweisung?
- Bis Sie die syntax der Sprache unter Kontrolle, ich respektvoll empfehlen, dass Sie verlassen threads allein.
- Threads sind ein grundlegender Teil der Sprache und so gut wie jeder Ort als um einen Anfang zu machen auf das lernen. Die Lösung dieses Problems liefert eine Lektion in der syntax auch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
1). Sie wollen Ihren code kompilieren.
Ihrer Zusammenstellung Probleme sind, weil Sie zu erklären, Ihre run-Methoden in der main-Methode. Trennen Sie Methodendeklarationen und dann nur mit main-erstellen & führen Sie Ihre threads.
2). Sie möchten zwei threads Betrieb gleichzeitig.
Das heißt, wir müssen entweder zwei unterschiedliche thread-Klassen oder ein einzelner thread mit Logik zu behandeln, sowohl Inkrementieren und Dekrementieren. Andrew Mao ' s Antwort gibt Ihnen einen Anfang, wie Sie definieren können zwei separate threads. Mein code oben verwendet, eine einheitliche definition für eine run-Methode, die einen parameter verwendet, um Arbeit aus dem Weg zu gehen.
3). Sie möchten zwei threads Betriebssysteme, die gleichzeitig auf die gleichen Daten, weil, während Sie das Inkrementieren/Dekrementieren getrennt, die Sie benötigen, zu prüfen, Kollisionen.
Einen einfachen Weg, dies zu tun ist erstellen Sie die Objekte, die Sie Bearbeiten möchten (num1 und num2) in deiner main-Methode, und dann geben Sie nur Verweise auf diese Objekte, um deine threads. Beispiel in meinem code oben.
4). Sie wollen, Dinge zu testen
Alle von java.lang.* ist irgendwie davon ausgegangen werden automatisch importiert. Kein Schaden, indem es für Klarheit, aber auto-Importeur-Befehle auf der dev das Werkzeug der Wahl wird wahrscheinlich entfernen Sie es so überflüssig.
Zunächst, dein code sieht aus wie es sollte viel Kompilierungs-Fehler, die lässt mich vermuten, dass möglicherweise gehen über die Codierung der falsche Weg. Wenn Sie nicht verwenden können, eine IDE, dann muss kompilieren Sie früh und oft und nicht irgendein neuer code bis alle Kompilierungs-Fehler wurden behoben.
Zum Beispiel, Sie haben offenbar eine Methode, laufen, eingebettet in einer anderen Methode, Haupt -, und Sie einfach nicht tun. Ich schlage vor, dass Sie beginnen, beginnend mit einer kleinen code-Gerüst, das kompiliert, und dann wieder kompilieren Sie früh und oft. Auch die meisten Ihrer code außerhalb Ihrer main-Methode. Und Nein, die run-Methode ist nicht in der richtigen Lage, da Sie nur eine run-Methode, und es sollte in der Klasse selbst, nicht eingebettet in der Haupt-oder einer anderen Methode.
Bezug,
Dein compiler wird dir das sagen: befreien Sie sich von den import-und sehen, was passiert.
Den
run
Methode wird implementiert, indem ein thread muss in einer separaten Klasse. Sie können sicherlich setzen Sie in IhremThreadExperiment
Klasse, aber es kann nicht beides sein. In diesem Fall, Sie können trennen die beiden threads in innere Klassen:Nun, wir sind immer irgendwo, aber Sie noch brauchen, um zu beheben einige Probleme mit der Logik:
int
s als statische ist nicht gute Praxis. (Aber es ist okay für dieses Test-Szenario.)num == num2
Prüfung wird nur einmal und es gibt keine Garantien, was die Werte da sein, wenn das passiert. Es ist sehr unwahrscheinlich, dass die threads unterbrochen werden.int
svolatile
da Sie werden Lesen von verschiedenen threads.while
Zustand, inThread1
führt in eine Endlosschleife.