Java Suche Programmierthema

RobRob89

Ensign
Registriert
März 2011
Beiträge
213
Ich bin momentan dabei ein kleines Projekt zum Thema Threads in Java aufzuziehen.
Ziel ist es ein Programm zu haben das Multithreaded ist. Was ich bisher schon erfahren konnte ist das die JVM aufjeden fall wenn eine Multicore-CPU vorhanden ist das Sheduling an den OS-Kernel "weitergibt" der dann entsprechende Kernel-Threads draus macht. (So ist es zumindest in der Oracle VM & openJDK unter Linux.)

Nun meine Frage: Fällt irgendjemand ein Thema zu einem Programm ein? Es soll am besten natürlich irgendetwas nützliches machen :)

Viel Dank für eure Ideen schonmal im Voraus!

MfG RobRob
 
Zuletzt bearbeitet:
Du könntest einen Texteditor programmieren.
Man gibt einen längeren Text ein und das Programm tut folgendes:
Im ersten Thread wird der Text nach "Begriff A"durchsucht und mit "Begriff B" ersetzt.
Im zweiten Thread wird der Text nach nach "Begriff C" durchsucht und dieser wird rot markiert.
Im dritten Thread protokollierst du das Ganze und schreibst es in einer txt. rein.

Ist zwar nichts womit man Geld verdienen kann :evillol: aber zum lernen und verstehen von Multithreading denke ich ausreichend.
 
Wie wäre es mit irgendwas in Sachen Bildbearbeitung?
Da gibt es viele schöne Dinge, die man parallelisieren kann.
Du kannst ja ein kleines Bildbearbeitungsprogramm schreiben,
das halt bestimmte Manipulationen am Bild vornimmt.
zB Farbtiefenreduzierung mit Floyd-Steinberg-Dithering oder
Größe ändern, croppen, usw.

Gruß Timo
 
du könntest auch mit client-server herumhantieren.
thema: serverüberwachung
serverandwendung: ließt diverse stats vom sys aus und speichert diese
clientanwendung: baut verbindung auf und holt sich die stats

multithreading: die serveranwendung kannst du als multithreading server betreiben, findest du überall was dazu im inet^^ gute quelle ist "java ist auch eine insel"

mfg
 
RobRob89 schrieb:
Was ich bisher schon erfahren konnte ist das die JVM aufjeden fall wenn eine Multicore-CPU vorhanden ist das Sheduling an den OS-Kernel "weitergibt" der dann entsprechende Kernel-Threads draus macht. (So ist es zumindest in der Oracle VM & openJDK unter Linux.)

Das Scheduling wird immer vom Betriebssystem, egal ob Windows oder Linux, übernommen. Das ist also keine Eigenart von Java.

Einige Vorschläge hast du bereits gehört. P2P-Anwendungen eignen sich generell gut, indem Tasks etc. in parallelen Threads durchgeführt werden. Aber Threads zu starten, egal ob manuell oder über einen Pool ist relativ uninteressant. Interessanter ist bei dem Thema Multithreading die Synchronisation (Locks, Semaphore, etc.) und synchrone und asynchrone Tasks.

Eventuell wären als Einstieg die "Speisenden Philosophen" interessant. Das kombiniert mehrere Themen, die für das Multithreading von Relevanz sind.
 
Danke für euren Input, sehr einfallsreich!

@Stefan_Sch Das stimmt nicht ganz... schonmal was von User-Threads und Kernel-Threads gehört?
Werde fürs erste mal reines Multithreading anwenden:

Ich möchte ein Textprogramm schreiben mit dem man Textfiles (später auch einfach nur Streams und eventuell auch reine Binärdateien) nach gewissen Userkriterien durchsuchen kann. Suchbefehle können dann kombiniert werden und jedem Suchbefehl wird dann ein Thread zugeordnet.

Ablauf etwa so:

- User ruft den Service (z.b. als Server implementiert) oder das Programm auf

- Der Service frägt nach einem Input z.b. in Form einer Datei (unter linux wird es dann immer eine Datei sein ;)) und liest den Input ein

- Danach soll der User seine Suchbegriffe eingeben in etwa so:
"*hallo";"^w(0-9)";"suchmich"

- Nun sartet der Service für jeden Suchbegriff einen Thread und spuckt die Ergebnisse aus
 
RobRob89 schrieb:
@Stefan_Sch Das stimmt nicht ganz...

Doch doch, das stimmt garantiert!

RobRob89 schrieb:
schonmal was von User-Threads und Kernel-Threads gehört?

Das ist in Bezug auf die JVM irrelevant. Die von dir hier genannten User-Threads, genauer gesagt sind es bei virtuellen Maschinen Green-Threads, werden schon seit der JVM 1.1 nicht mehr implementiert.

Green-Threads haben diverse Nachteile gegenüber nativen Threads, so das weder .NET, noch Java auf sie zurückgreifen. Das Scheduling obliegt sowohl unter Windows, als auch Linux dem OS, weil nur das OS im Bilde über alle laufenden Threads ist.

Übrigens wäre ich vorsichtig mit dem Begriff User-Thread in Java, denn ein User-Thread in Java ist nicht das, was du vielleicht denkst.
 
Zuletzt bearbeitet:
Was genau definiert denn einen User-Thread unter Java?

Für mich sind User-Threads einfach Threads die innerhalb eines Stacks laufen und nicht auf getrennten Stacks... "Scheinthreads" sozusagen...
 
Die von dir ursprünglich genannten Bezeichnungen User-Thread, Kernel-Thread oder auch Fibers stehen für unterschiedliche Arten von Threads, deren Kontext variiert. Per se ist ein Kernel-Thread ein Thread, der wie der Name schon vermuten lässt innerhalb des Kernels läuft und auch vom Kernel geschedult wird. User-Threads laufen nicht im Kernel-Space, sondern im User-Space. Der Kernel hat keine Kenntnisse über den Thread. Dieser Unterschied ist der springende Punkt.

Wenn wir von User Scheduled Threads sprechen, dann sind Threads gemeint, die vom Programm selbst verwaltet werden. Die Bezeichnung ist allerdings fließend, denn es hängt von der Implementierung ab. Oftmals laufen User-Threads sozusagen "on the top" auf den Kernel-Threads, um die Vorteile des preemptiven Schedulings nutzen zu können.

In Java hat die Bezeichnung User-Thread wiederum eine ganz andere Bedeutung. Java unterscheidet zwischen einem User- und Daemon-Thread, wobei der Terminus User-Thread nicht dem anfangs genannten entspricht, sondern generell einfach für einen Thread steht, der auf Kernel-Threads basiert, aber im Gegensatz zu einem Daemon-Thread einen Programmabruch verhindert. Das heißt, trotz eines laufenden Daemon-Thread, kann die JVM das Programm beenden.

User-Threads können sich einen Stack teilen, das muss aber nicht sein und ist in der Regel auch nicht der Fall.
 
Zuletzt bearbeitet:
Stefan_Sch schrieb:
Das Scheduling wird immer vom Betriebssystem, egal ob Windows oder Linux, übernommen. Das ist also keine Eigenart von Java.

Das ist so nicht ganz korrekt. Unter Java 1.2 wurden Threads intern durch die JVM verwaltet! Erst ab Java 1.5 wurde die Verwaltung an das BS übergeben...
 
BullshitBingo schrieb:
Das ist so nicht ganz korrekt. Unter Java 1.2 wurden Threads intern durch die JVM verwaltet! Erst ab Java 1.5 wurde die Verwaltung an das BS übergeben...

Zum Thema Green Threads hatte ich hier schon in Beitrag #9 alles wissenswerte erwähnt.
 
Multithreading für Textverarbeitung? Ist wohl ziemlich überflüssig. Könntest z.B. Videos in andere Formate konvertieren....
 
Ist jetzt schon ein weilchen her aber ich hab zu dem was ich angesprochen habe etwas entwickelt (Arbeitszeit ca. 20-30 stunden inklusive gui etc.). Das programm liest die userinputs ein (z.b. "a e i") und startet danach für jeden der suchbegriffe einen thread der die datei jeweils einliest und gleichzeitig nach den suchbegriffen ausschau hält.
Der suchalgorithmus ist bisher ein String-Matching-Algorithmus in naiver form und arbeitet "byte weise".
Das ganze läuft gut soweit und ich würd das teil gerne open source machen und auf git hochladen.

Welche Lizenz empfehlt ihr mir dazu? (z.b. GNU ?)
 
Ist völlig egal, welche Lizenz Du verwendest :D Oder hast Du vor, den Code irgendwann in ein kommerzielles Projekt zu überführen?

GNU, MIT, Apache, Creative Commons, kannst Du alles nehmen. Ich persönliche würde für solche Dinge MIT nutzen. Schön kurz und am liberalsten.
 
Ich möchte einfach nicht das jemand einfach so meinen code nimmt und ihn als seinen ausgibt :D

Nachtrag: kannste mir auch sagen wie man das macht? bzw. wie z.b. so ein kommentar in einer source file aussehen muss bzw. wie der inhalt aussieht der die lizenz wiederspiegelt
 
Zuletzt bearbeitet:
Eine Lizenz ist immer sinnvoll. Ob bei solchen Lernprojekten Code produziert wird, der für Dritte interessant ist, sei mal dahingestellt.

Am Einfachsten fügst Du den Lizenztext an den Anfang jeder Datei. Etwa so: http://websvn.ow2.org/filedetails.php?repname=asm&path=%2Ftrunk%2Fasm%2Fsrc%2Forg%2Fobjectweb%2Fasm%2FByteVector.java. Es gibt Tools, die das automatisch sicher stellen.

Bei längeren Lizenztexten kann man auf eine zentrale Datei mit der Lizenz verweisen. Hier habe ich gerade kein Beispiel zur Hand. Aber Google findet sicher was.
 
Zurück
Oben