ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
485
485
EMPFEHLEN
-
07.05.07 21:07 #1
- Registriert seit
- Mar 2007
- Beiträge
- 13
Hallo zusammen!
Ich habe mir einen kleinen Server geschrieben, der an sich gute Arbeit leistet. Der einzige Haken der mich stört ist, daß das ganze Teil in einem einzigen Thread läuft. Ergo hilft mir der brave kleine Dual-Core Prozessor nicht wirklich. Da ich den natürlich gerne ausnützen würde, hätte ich gerne gewußt wie man richtig Multi-threaded.
Wie ein Thread an sich funkt ist mir denke ich klar. ABER: Ich habe zb eine Klasse die mir die Lesezugriffe auf die DB übernimmt, welche hptsl static Methoden beinhaltet. Wie kann ich das nun am besten jede einzelne Methode als eigenen Thread laufen lassen? Soviel ich bis jetzt von Threads gelesen habe, braucht es immer eine Klasse mit einer run() Methode. Funkt das auch wenn ich mehrere class in ein File schreibe? Davon bin ich eigentlich kein wirklicher Fan, da es den Code meines Erachtens unübersichtlich macht. Wie macht man das richtig?
Vielen Dank für die Hilfe,
Andreas
-
08.05.07 13:25 #2
- Registriert seit
- May 2007
- Beiträge
- 4
Hallo Andreas,
ein Thread wird wie folgt erstellt.
Als erstes entwicklest Du dir eine Klasse die von der Klasse "Thread" erbt.
Danach implementierst Du die methode "public void run()" in die Klasse.
Um diesen Thread ausführen zu können erzeugst Du in der main-Methode,
deines Haupt-Klasse, eine neues Objekt vom Typ Deiner Thread-Klasse und
kannst es dann per nameDesObjekts.start() aufrufen. Die Methode "start()" ruft
die Methode "run()" in Deiner Thread-Klasse auf und führt sie aus.
Hier mal ein kleines Bsp.
MyThread-class
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
[COLOR="DarkRed"]package[/COLOR] de.tutorials.thread [COLOR="Green"][I]//erbt von Thread[/I][/COLOR] [COLOR="DarkRed"]public class[/COLOR] MyThread [COLOR="DarkRed"]extends[/COLOR] Thread { [COLOR="DarkRed"]public[/COLOR] MyThread() { } [COLOR="DarkRed"]public void[/COLOR] run() { System.[COLOR="RoyalBlue"]out[/COLOR].println([COLOR="RoyalBlue"]"Hier läuft mein Thread!"[/COLOR]); } }
TestThread-class
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
[COLOR="DarkRed"]package[/COLOR] de.tutorials.thread [COLOR="DarkRed"]public class[/COLOR] TestThread { [COLOR="DarkRed"]public static void[/COLOR] main(String[] args) { [COLOR="Green"][I]//erzeugen des Thread[/I][/COLOR] MyThread meinThread = [COLOR="DarkRed"]new [/COLOR]MyThread(); MyThread meinThread2 = [COLOR="DarkRed"]new[/COLOR] MyThread(); [COLOR="Green"][I]//Thread starten[/I][/COLOR] meinThread.start(); meinThread2.start(); } }
Eine weitere Möglichkeit ist es eine Klasse zu erstellen, die das Interface Runnable
implementiert.
Das funktionert fast genau so, außer dass man das Objekt, das Runnable implementiert,
an den Konstruktor eines neuen Thread-Objectes übergeben muss.
Code :1 2 3 4 5
[I][COLOR="Green"]//Object erzeugen vom eigenen Typ der Klasse die Runnable implem. [/COLOR][/I] ThreadImplemetiertRunnable myThread = [COLOR="DarkRed"]new[/COLOR] ThreadImplemetiertRunnable(); [I][COLOR="Green"]//Objekt an den Konstruktor des neu Threadobjekts übergeben[/COLOR][/I] Thread t = new Thread(myThread); t.start();
Ich hoffe, ich konnte es erstmal einigermaßen verständlich erklären.
MfG
fallout boy
-
08.05.07 13:31 #3
- Registriert seit
- Mar 2007
- Beiträge
- 13
hallo fallout boy!
Danke erstmal für deine Hilfe!
Wie man einzelne Threads schreibt habe ich kapiert. ABER: so wie in deinem Bsp, kann ich ja immer nur eine einzige Methode als run() implementieren (als das was vorher die Methode gemacht hat in die run() verschieben). Ergo müsste ich ja für jede Methode von der ich will daß sie in einem eigenen Thread läuft eine eigene Klasse schreiben, die eine run() Methode hat, welche dann das macht was ich möchte.
Nun habe ich in meinem Programm wie erwähnt zb eine ReadData Klasse die diverse SELECT queries an die DB schickt und mir die Daten in verschiedener Form retourniert (einmal einen JTable, einmal ein einzelnes Objekt, etc). Wenn ich für jede dieser Methoden eine eigene Klasse schreiben muß, gehe ich ja unter in Klassen.
Ich hoffe du verstehst was ich meine
lg,
Andreas
-
Hallo,
du könntest auch einfach in jeder Methode einen neuen Thread starten
Code java:1 2 3 4 5 6 7 8 9 10
public void deineMethode(){ new Thread(){ public void run(){ //mach irgendwas } }.start(); }
So kannst du es direkt in deine Methoden reinschreiben und brauchst nicht immer ne eigene Klasse zu schreiben.
Wenn man in der object-orientierten Programmierung richtig plant, dann hat man eine Menge Klassen, das lässt sich maximal durch Spaghetti-Code vermeiden.
MFG
zEriXGeändert von zerix (08.05.07 um 13:43 Uhr)
-
08.05.07 13:43 #5MeinerEiner_80 Tutorials.de Gastzugang
Moin!
Ist dir damit geholfen?
Code :1 2 3 4 5 6 7 8 9 10 11 12
Thread t = new Thread(){ public void run(){ //code } }; t.start(); t= new Thread(){ public void run(){ //andere code } }; t.start();
Edit: Da war wohl jemand schneller
-
08.05.07 13:44 #6
- Registriert seit
- Mar 2007
- Beiträge
- 13
hehe
auch wenn ich spaghetti an sich mag, so habe ich gegen spaghetticode eine gewisse aversion *lach*
auf das mit den new Thread() bin ich noch nicht gekommen. ist das ordentlicher programmierstil, oder ist das eher pfusch. wenn ich schon was lerne, dann soll es auch was gscheites sein
wie macht ihr das? die eine klasse (die nur die lesezugriffe macht), hat immerhin satte 30 Methoden...
Edit: danke meinereiner!
lg,
AndreasGeändert von afurtenbacher (08.05.07 um 13:48 Uhr)
-
Ich kenne ja deinen Code nicht, aber ist es nicht Möglich, dass du die Daten an einer Stelle aus der Datenbank liest, die Beispielsweise in einer HashMap packst und dann deine GUI anhand der HashMap aktualisierst?
-
08.05.07 13:55 #8
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
Ab Java 5 sollte man sich angewöhnen Threads nicht mehr über new Thread(){ ... zu erzeugen (es sei denn man braucht Daemon-Threads...) sondern mit der ExecutorService / Executors Infrastruktur.
Das hat dann den Vorteil, dass man die Threading/Scheduling/Pooling Konzepte einfacher konfigurierbar machen kann.Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
/** * */ package de.tutorials; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * @author Thomas.Darimont * */ public class ThreadCreationExample { /** * @param args */ public static void main(String[] args) { ExecutorService executorService = Executors.newSingleThreadExecutor(); System.out.println(executorService); Runnable runnable = new Runnable(){ @Override public void run() { for(int i = 0; i< 10;i++){ System.out.println(i); try { TimeUnit.SECONDS.sleep(1L); } catch (InterruptedException e) { e.printStackTrace(); } } } }; executorService.execute(runnable); } }
Siehe auch hier:
http://www-128.ibm.com/developerwork...j-jtp1126.html
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
08.05.07 14:54 #9
- Registriert seit
- Mar 2007
- Beiträge
- 13
-
Ich hab dich so verstanden, dass jedes GUI-Element, eine Anfrage an die DB schickt, über deine DB-Klasse. Also wenn z.b. 3 Elemente gleichzeitig einen Kunden anzeigen, alle 3 eine Anfrage an die DB senden.
-
08.05.07 15:18 #11
- Registriert seit
- Mar 2007
- Beiträge
- 13
ach so. nein nein
es wird eine query an die db geschickt, die erstellt das kunden-objekt, liefert dieses zurück und aus diesem werden die daten für die gui-elemente gelesen.
lg,
Andreas
-
09.05.07 21:55 #12
- Registriert seit
- Mar 2007
- Beiträge
- 13
noch eine frage zu den threads:
werden bei einer mehrprozessormaschine nur ganze prozesse auf die kerne verteilt, oder auch einzelne threads?
lg,
Andreas
-
09.05.07 22:55 #13
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
IMHO ja.
@Thomas: und so ist das "state of the art"?
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
Ähnliche Themen
-
Grundlage Frage zu AS3 (import etc.) [Anfänger Thread]
Von SonMiko im Forum Flash PlattformAntworten: 2Letzter Beitrag: 27.11.08, 11:21 -
frage zu Thread
Von Winner im Forum VisualStudio & MFCAntworten: 4Letzter Beitrag: 06.11.07, 15:55 -
Großer Anfänger Thread
Von Vertigo21 im Forum .NET CaféAntworten: 76Letzter Beitrag: 22.09.06, 15:26 -
MySQL Tabellen verknüpfen (Anfänger Frage) + Frage zu Get
Von benurb im Forum PHPAntworten: 5Letzter Beitrag: 01.04.05, 13:00 -
Thread public [Anfänger]
Von MrHoki im Forum JavaAntworten: 2Letzter Beitrag: 04.03.05, 19:52





Zitieren



Login





