Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Desktop-Applikationen und Grafik > Thread mehrfach starten
Antwort
 
Themen-Optionen
Alt 09.02.2007, 00:13   Nach oben    #1
Neuer Benutzer
 
Registriert seit: 08.02.2007
Beiträge: 8
Standard Thread mehrfach starten

Guten morgen erstmal

ich habe ein folgendes Problem: Ich starte von meiner GUI aus einen Thread welcher auch durchläuft und macht was er soll bis ich ihn anhalte. Jedoch brauche ich ihn danach erneut. Als ich ihn dann erneut starten wollte bekahm ich immer nur folgendes:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
Nach ner weile googlen fand ich herraus das man einen Thread nur einmal starten kann danach ist er Schrott. Also kam ich auf die Idee in der Threadklasse ne void zu machen in der er den Thread cloned und dann den clone startet. Leider weiß ich nicht wie. Wenn mir jemand helfen kann wär ihm ihm sehr dankbar ^^

MfG und gn8
Jack77
jack77 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2007, 12:33   Nach oben    #2
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Hallo,
willkommen im Forum.

So ganz habe ich das Problem nicht verstanden. Warum startest du nicht einfach einen neuen Thread?
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.02.2007, 15:08   Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

Vielleicht sowas?
java Code:
  1. public class ReusableThread implements Runnable
  2. {
  3.  
  4.     public void run()
  5.     {
  6.         System.out.println("Running");
  7.     }
  8.  
  9.     /**
  10.      * startet den Thread wieder
  11.      *
  12.      */
  13.     public void start() {
  14.         new Thread(this).run();
  15.     }
  16.    
  17.     public static void main(String[] args)
  18.     {
  19.         ReusableThread rt = new ReusableThread();
  20.         rt.start(); //erster Durchlauf
  21.         rt.start(); //zweiter - " -
  22.         rt.start()//dritter - " -
  23.     }
  24.  
  25. }
__________________
Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag.
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.02.2007, 11:58   Nach oben    #4
Erfahrener Benutzer
 
Benutzerbild von Xean
 
Registriert seit: 17.08.2005
Beiträge: 425
Standard

Leuft der dann immer nacheinander???
Außerdem meinte jack77, dass er den Thread stoppen möchte. Und dann geht er nicht mehr.
Ich würde mir ne klasse schreiben, die starten, die dann irgendwann stoppen, und dann ein neues Objekt initialisieren und dieses dann laufen lassen.
Xean ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.02.2007, 13:27   Nach oben    #5
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

Zitat:
Leuft der dann immer nacheinander???
Wie meinst du das?

@jack77
Wie du schon gemerckt hast, kann man eine Threadinstanz nur einmal benutzen. Poste mal ein bischen Code und versuch mal zu erklären was du vor hast. Vielleicht/Bestimmt läßt es sich anders lösen.
__________________
Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag.
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.02.2007, 16:57   Nach oben    #6
Neuer Benutzer
 
Registriert seit: 08.02.2007
Beiträge: 8
Standard

Danke für eure Zahlreichen Antworten. Ich hab mein Problem gelöst bekommen in dem ich vor aufrufen des Threads den Thread lösche und einen neuen entwerfe. Also wie folgt(nur die void

Code:
bauen = null;
        bauen = new baumenue();
        bauen.setBauen(listGebauede.getSelectedIndex(),1);          // Gebauedetyp festlegen
        bauen.start();                                              // Bauthread starten
        lblBauStatus.setText(bauen.getGebauedeNamen(listGebauede.getSelectedIndex())); // Baumenue richten
        btnBauBauen.setEnabled(false);
        btnBauAbbrechen.setEnabled(true);
        listGebauede.setEnabled(false);
        lblUebersichtBauStatus.setText(bauen.getGebauedeNamen(listGebauede.getSelectedIndex())); // Uebersicht richten
        btnUebersichtBauAbbrechen.setEnabled(true);
        bau_set = true;
Da dies Problem nun gelöst ist hebe ich ein neues: Ist es möglich einen Thread dynamisch zu erstellen?
Was dahinter steckt: Ich entwerfe ein kleines Aufbausimulationsspiel in dem man mehrere Städte haben kann. Ich brauche für jede Stadt einen Thread der bauen soll. Mein Problem ist nun dass ich den THread dazü gerne mit den XY Koordinaten der Stadt erstellen möchte. Leider kann ich nicht einen Thread erstellen welcher den Namen aus der Variable für die XY Koordinaten nimmt. Er will dann immer nur einen Thread erstellen welcher so heißt wie die Variable und nichts dessen wert. Hat dort jemand einen Rat?

MfG
Jack77
jack77 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.02.2007, 12:43   Nach oben    #7
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Zitat:
Zitat von jack77 Beitrag anzeigen
Ich brauche für jede Stadt einen Thread der bauen soll. Mein Problem ist nun dass ich den THread dazü gerne mit den XY Koordinaten der Stadt erstellen möchte. Leider kann ich nicht einen Thread erstellen welcher den Namen aus der Variable für die XY Koordinaten nimmt. Er will dann immer nur einen Thread erstellen welcher so heißt wie die Variable und nichts dessen wert.
Uff, das habe ich nicht verstanden.

Du willst, dass pro Thread ein anderes Objekt bearbeitet wird, quasi dass es pro "Stadt-"Objekt einen eigenen Thread gibt, ja?
Was meinst du jetzt aber mit "Er will dann immer nur einen Thread erstellen welcher so heißt wie die Variable und nichts dessen wert."?
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.02.2007, 22:50   Nach oben    #8
Neuer Benutzer
 
Registriert seit: 08.02.2007
Beiträge: 8
Standard

Ich weiß ist etwas Kompliziert ^^

Also es sieht wie folgt aus: ich habe eine Klasse baumenue welche einen Thread darstellt. Dann habe ich eine Klasse einzelspielergui.java in der ein Objekt(=Thread) aus der Klasse baumenue.java erstellt wird. Nun klappt das ja auch alles aber nur für die aktuelle Stadt. Diese wird durch eine Variable in der Klasse karte.java dargestellt (Karte.aktuell[]) dargestellt d.h. dort befinden sich die X und Y Koordinaten der aktuellen Stadt in der sich der Spieler befindet. Nun wollte ich es wie folgt machen: ich wollte pro Stadt (XY Koordinaten) einen Thread erstellen der dementsprechend die Koordinaten in seinem Namen trägt. Und dort ist mein Problem. Wenn ich ihm sage er soll mir einen Thread erstellen (baumenue bauen + map.aktuell[0] + map.aktuell[1] = new baumenue(); // ich weiß das geht nicht aber so in etwa soll es sein ^^). Ich hoffe ich konnte es euch verständlich machen und hoffe auf Hilfe

Thx schonmal
Jack77
jack77 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2007, 09:31   Nach oben    #9
Benutzer
 
Benutzerbild von xabbuh
 
Registriert seit: 03.12.2005
Ort: Osnabrück
Beiträge: 74
Standard

Hallo Jack77,

wenn ich dich richtig verstehe, möchtest du also die Koordinaten an ein Objekt der Klasse Baumenue übergeben? Dann würde ich einfach einen Konstruktor definieren, dem du die Koordinaten als Parameter übergibst.

Gruß
Christian

P.S.: Wäre für Koordinaten nicht eher ein Point-Objekt sinnvoll?
xabbuh ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2007, 09:35   Nach oben    #10
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Zitat:
Zitat von xabbuh Beitrag anzeigen
Wäre für Koordinaten nicht eher ein Point-Objekt sinnvoll?
Definitiv, da die Klasse Point/Point2D ja eigentlich genau das abbildet: eine Koordinate.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2007, 10:18   Nach oben    #11
Neuer Benutzer
 
Registriert seit: 08.02.2007
Beiträge: 8
Standard

Ich glaube ich hab mich immer noch unverständlich ausgedrückt: Ich möchte ein Thread erstellen welcher sich aus der Klasse baumenue ableitet. Normalerweise geht das ja so:

baumenue threadname = new baumenue();

Und ich möchte das an das "threadname" noch die XY Koordinaten angeklemmt werden.

baumenue threadname34 = new baumenue(); // X = 3 Y = 4

die X und Y Koordinaten sind in einer Vorhandenen Variable vorhanden.
Ich hoffe ich konnte mich diesmal verständlicher ausdrücken.

MfG
Jack77
__________________
.:: OpenSuSE 10.2
.:: Java VM 1.6

PHP-Code:
 Freak jack77 = new Freak(); 
jack77 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2007, 11:35   Nach oben    #12
Benutzer
 
Benutzerbild von xabbuh
 
Registriert seit: 03.12.2005
Ort: Osnabrück
Beiträge: 74
Standard

Tut mir leid, aber verstanden habe ich dein Problem immer noch nicht. Wofür ist es dir denn wichtig, im Variablennamen die Koordinaten anzugeben?
xabbuh ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2007, 14:34   Nach oben    #13
Erfahrener Benutzer
 
Benutzerbild von karahead
 
Registriert seit: 23.11.2005
Ort: Stadtallendorf
Beiträge: 139
Standard

@jack77
Ich muss dich leider enttäuschen, denn sowas geht in der Form leider nicht.
Vielleicht würdest du einen Weg finden, wenn du dich mit der Java Bytecode Specification befasst aber dass wünsch ich keinem

Guck dir mal die Java annotations an, damit würde es vielleicht gehen. Kenn mich aber auf dem Gebiet nicht aus, da ich annotations noch nie gebraucht habe.

P.S. es gibt doch 1000 Wege sowas zu lösen, warum willst du unbedingt den schwierigsten nehmen?
__________________
Die Menschen wünschen sich Unsterblichkeit, aber wissen nichts anzufangen an einem verregneten Sonntag Nachmittag.

Geändert von karahead (13.02.2007 um 14:36 Uhr).
karahead ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2007, 15:04   Nach oben    #14
Neuer Benutzer
 
Registriert seit: 08.02.2007
Beiträge: 8
Standard

Nunja ich möchte halt pro Stadt einen einelnen Bauthread starten. Daher brauch ich halt die Koordinaten der Stad im Namen des Threads. Wenn jemand eine andere Idee hat: ich bin für vieles offen.

MfG
Jack77
__________________
.:: OpenSuSE 10.2
.:: Java VM 1.6

PHP-Code:
 Freak jack77 = new Freak(); 
jack77 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2007, 15:05   Nach oben    #15
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Zitat:
Zitat von jack77 Beitrag anzeigen
Daher brauch ich halt die Koordinaten der Stad im Namen des Threads.
Hm, nö.

Wieso denn?
Du brauchst die Informationen innerhalb der Instanz der Klasse, aber du musst den Thread doch nicht so benennen. xabbuh hat ja schon auf den Konstruktor mit geeignetem hingewiesen
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2007, 15:13   Nach oben    #16
Neuer Benutzer
 
Registriert seit: 08.02.2007
Beiträge: 8
Standard

Tut mir leid Ben aber ich möchte nicht eine Variable an einen Thread übergeben (dafür gibts ja bekanntlich getter und setter) sondern mehrere Threads welche ich ja irgendwie unterscheiden muss.

MFG
Jack77
__________________
.:: OpenSuSE 10.2
.:: Java VM 1.6

PHP-Code:
 Freak jack77 = new Freak(); 
jack77 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2007, 16:43   Nach oben    #17
Erfahrener Benutzer
 
Benutzerbild von Xean
 
Registriert seit: 17.08.2005
Beiträge: 425
Standard

Die Frage ist halt, was du dir vorstellst.
wenn du mehrere Threads hast, warum machst du dann nicht ein Array
=> baumenue[][] threads = new baumenue[max_x][max_y];
baumenue bm = threads[x][y];

Aber vielleicht hat die Stadt ne ID??? (wars nicht so: pro stadt ein thread?) dann könntest du auch so ein Array machen:
(brauchst noch die anzahl von städten, zb. wenn du die auch in einem Array hast
baumenue[] threads = new baumenue[cities.length];
baumenue bm = threads[cities.getID()];

oder du hast ne Klasse Cities (oder so was änliches), da kannst du dann ein getter/setter für ein Thread (getThread()/setThread()) hinzu fügen, und die Klasse den Thread verwalten lassen



oder ich hab was nicht gesehen/falsch verstanden, dann kann man meinen beitrag überlesen
Xean ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.02.2007, 21:40   Nach oben    #18
Neuer Benutzer
 
Registriert seit: 08.02.2007
Beiträge: 8
Standard

Danke für Eure Hilfe. Hab mein Problem nun gelöst bekommen. Es zu erklären würde zu lange dauern also falls es jemand wissen will soll er mich kontaktieren. Danke nochmal für eure Hilfe

MfG
Jack77
__________________
.:: OpenSuSE 10.2
.:: Java VM 1.6

PHP-Code:
 Freak jack77 = new Freak(); 
jack77 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2007, 17:44   Nach oben    #19
Benutzer
 
Registriert seit: 01.02.2005
Beiträge: 64
Standard

Hmmm - nur der Form halber...

Wenn du die Position im Var-Namen haben willst, könnte man das nicht auch mit ner Hashtable erledigen, statt mit dem 2D-Array zu arbeiten? Da müsste man vorher noch nicht mal unbedingt die Länge der Liste kennen...

Also so von wegen
Code:
Hashtable bauThreadTable = new HashTable();
 
bauThreadTable.put("Stadt54",new bauThread(5,4));
//...etc für weitere Städte
 
//und der Aufruf dann:
Thread bauen = (Thread) bauThreadTable.get("Stadt54");
bauen.start();
Nachteil an der Methode ist natürlich wieder, dass du dem Thread Variablen übergeben musst...

Ich blick da aber nich durch, wie du den Thread laufen lassen willst, ohne ihn von außen mit Infos zu füttern - geht ja um was grafisches, also sollte er doch zumindest irgendwie die Grafikobjekte bekommen...
oder hast du etwa alles andere auf die "public" und "static" Modifier gesetzt?

Wie hast du's denn gelöst?
__________________
  1. My software never has bugs. It just develops random features!
  2. Beta. Software undergoes beta testing shortly before it's released. Beta is Latin for 'still doesn't work.'
  3. There are two ways to write error-free programs. Only the third one works.
Binary ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen