Mit ThreadPoolExecutor Arbeit unter Java effizient parallelisieren

Es gibt immer wieder Aufgaben, die sehr lange dauern und sehr große Mengen an Daten verarbeiten müssen. Dabei geht es meistens um Minuten oder gar Stunden, Tage …

Diese sollten sinnvollerweise parallelisiert werden, um die Leistungs des Systems zu nutzen. Heutige Systeme sind sehr oft Mehrkern- bzw. Mehrprozessorsysteme. Auch ist das GHz-Rennen im Moment zu Ende und die Leistung steigt über die Anzahl der Prozessoren bzw. Kerne.

Das folgende Beispiel zeigt wie man unter Java Aufgaben parallel verarbeiten kann, ohne sich groß den Kopf um die Ausführung zerbrechen zu müssen. Der ThreadPoolExecutor ist meiner Meinung nach eine sehr gute Möglichkeit Aufgaben zu parallelisieren, die Parallel ausgeführt werden können. Der große Vorteil ist, dass er Threads für das Abarbeiten am laufen hält. Das bedeutet bei neuen Aufgaben werden normalerweise keine Threads gestartet und somit entfällt faktisch dieser Overhead. Threads im Pool werden nur beendet, wenn sie länger als der festgelegte Timeout nicht benutzt werden oder sie vom Programmierer explizit beendet werden.

Nicht erschrecken. Das meiste davon sind Kommentare und Beispielcode.

Ich weiß – weniger Gelaber und her mit dem Code!

[code]
import java.util.concurrent.*;

class MyThreadPoolExecutor
{
//Parallel running Threads(Executor) on System
int corePoolSize = 2;

//Maximum Threads allowed in Pool
int maxPoolSize = 4;

//Keep alive time for waiting threads for jobs(Runnable)
long keepAliveTime = 10;

//This is the one who manages and start the work
ThreadPoolExecutor threadPool = null;

//Working queue for jobs (Runnable). We add them finally here
final ArrayBlockingQueue workQueue = new ArrayBlockingQueue(5);

public MyThreadPoolExecutor() {
threadPool = new ThreadPoolExecutor(corePoolSize, maxPoolSize,
keepAliveTime, TimeUnit.SECONDS, workQueue);
}

/**
* Here we add our jobs to working queue
*
* @param task a Runnable task
*/
public void runTask(Runnable task) {
threadPool.execute(task);
System.out.println(„Tasks in workQueue..“ + workQueue.size());
}

/**
* Shutdown the Threadpool if it’s finished
*/
public void shutDown() {
threadPool.shutdown();
}

public static void main(String args[]) {
MyThreadPoolExecutor mtpe = new MyThreadPoolExecutor();

for (int i= 0; i < 6; i++ ) { mtpe.runTask(new WorkerRunnable(i)); } mtpe.shutDown(); System.out.println("Finished! :)"); } /** * This is the one who do the work * * This one is static for accessing from main class */ private static class WorkerRunnable implements Runnable { //so we can see which job is running private int jobNr; /** * This is for understanding only * * @param jobNr number for displaying */ public WorkerRunnable(int jobNr) { this.jobNr = jobNr; } @Override public void run() { for(int i = 0; i < 10; i++) { try { System.out.println("Thread "+jobNr+" calculated "+ i); Thread.currentThread().sleep(1000); } catch (InterruptedException ie) { ie.printStackTrace(); } } } } } [/code] Da in diesem Beispiel die Anzahl der Parallel laufender Threads (corePoolSize) auf statisch 2 begrenzt ist, sollte die Zahl über Prozessoranzahl (siehe hier) bestimmt werden. Auch sollte man nicht vergessen die maximale Anzahl an Threads (maxPoolSize) entsprechend anzupassen.

Anzahl Prozessoren bestimmen welche für die Java Virtual Machine (JVM) vom System zur Verfügung stehen

Da derzeitige Computersysteme in Anzahl der Prozessoren (im Moment Kerne) und nicht mehr im GHz wachsen, muss auch ein Umdenken bei der Programmierung passieren. Das bedeutet wir müssen als Programmierer Aufgaben parallelisieren oder unabhängige Prozesse bzw. Threads parallel ausführen, um die Leistung möglichst effizient ausnutzen zu können. Wenn das möglich ist, dann sollte das Programm über die Anzahl der Prozessoren (im Moment Kerne) selbstständig bestimmen, wie viele Prozesse bzw. Threads es parallel ausführt.

Das folgende Codefragment bestimmt die Prozessoranzahl unter Java:
[code]
public class ProcessorCounter {

public static void main(String[] args) {

Runtime runtime = Runtime.getRuntime();

int nrOfProcessors = runtime.availableProcessors();

System.out.println(„Number of processors available to the Java Virtual Machine: “ + nrOfProcessors);
}
}
[/code]

Home – ein Film von Yann Arthus-Bertrand

Der Film Home von Yann Arthus Bertrand zeigt eindrucksvoll, wie wir unsere Umwelt zerstören und noch immer glauben, dass die Erde genug Kraft hat sich parallel selbst vor unseren Schäden zu heilen. Wer der englischen Sprache mächtig ist, sollte sich diesen Film anschauen.

Der Link zum Film: http://www.youtube.com/homeprojectDE

Die Seite zum Film: http://www.home-2009.com/

Jeder sollte sich den Film zuerst anschauen, bevor er negative bzw. positive Meinungen verbreitet.

ext3 Performanzverbesserungen und CFQ Linux Scheduler Internals auf lwn.net

Heute bin ich zufälligerweise über den Artikel Solving the ext3 latency problem gestolpert. In diesem ist beschrieben wie Latency Probleme im ext3 Dateisystem untersucht, aufgedeckt und behoben wurden. Vor allem interessant finde ich die Beschreibung der internen Abläufe im Kernel und besonders im CFQ Scheduler. Dieser stellt in heutigen Betriebssystemen den modernsten Scheduler dar.

Besonders die Probleme mit fsync() Aufrufen sind mir sehr gut bekannt. Allerdings habe ich sie ohne weitere Untersuchungen auf die Festplatte geschoben, weil ich bei Windows XP deutlich schlimmere Verzögerungen miterleben muss. Ich freue mich schon auf den 2.6.30er Linux Kernel und den deutlichen Performanzzuwachs.

Vor allem lobe ich die ausführliche und aufschlussreiche Berichtserstattung des Problems. Dadurch wurde den Lesern gleichzeitig notwendiges Hintergrundwissen für die Optimierung des Dateisystems mitgeteilt. Auch wurde damit gezeigt, dass an Linux mehrere Personen arbeiten und allen sehr viel an der Qualität des Linux Kernels liegt.

Ich wechsele die Branche: Refelector Guy

Heute bin ich bei der Suche nach „Wie falte ich einen runden Reflector?“ auf das folgende Video gestoßen:
The Best Job In The World – Bikini Reflector

Da ich jetzt einen solchen Reflektor habe, werde ich kräftig üben und wenn die Zeit gekommen ist, dann bewerbe ich als Reflector Guy.

Den wichtigsten Spruch habe ich schon gelernt: „Nobody else in the world can hold the reflector in the angle, so the sun falls on the model. I’m the Reflector Guy!“

Wünscht mir viel Erfolg in der neuen Branche und Goodbye Informatik!

PS: Den Reflector kann ich schon mal falten. 😉

Ich bin begeistert – Android als Mobiltelefon-Betriebssystem rockt!

Ich habe lange auf ein vernünftiges Mobiltelefon von Nokia gewartet, aber das wird wohl nie erscheinen.

Die Politik von Apple gefällt mir gar nicht und die Beschränkung auf den Apple Store ist alles andere als akzeptabel. Wenn das IPhone auch von diesem Problem befreit werden kann, so ist es keine brauchbare Lösung.

Jetzt ist es ein Android Mobiltelefon von HTC geworden. Das G1 (ohne T-Com Branding!!!) sieht nicht so toll aus wie ein IPhone, aber es hat einige wichtige Vorteile:

  • Basiert auf Open Source und jedem ist freigestellt Software dafür zu schreiben und sie darauf zu installieren. Ich bin nicht gezwungen den Android Markt zu nutzen und kann Software aus anderen Quellen nutzen.
  • Das G1 von HTC ist verdammt schnell in der Reaktion und Bedienung. Einen IPhone kann es nicht schlagen, aber es ist ein riesen Sprung im Vergleich zu Symbian.
  • Die Basisfunktionalität ist ordentlich implementiert und sehr stabil. Den Rest kann man als Erweiterung dazu installieren.
  • Meine Rufe wurden erhöht – mit Android und Apple Iphone wurde endlich ein E-Mail Client auf dem Mobiltelefon erschaffen, welcher auch so genannt werden kann. Blackberry ist mir einfach zu teuer, wenn die Technik auch gut ist. Zudem leitet Blackberry alle E-Mails durch eigene Sever in Amerika und das ist für mich nicht akzeptabel. Für viele Firmen auch da sie die Daten an ein anderes Land transferieren und damit keinen Einfluss darauf haben.
  • Der Browser auf dem Apple Iphone und IPod ist schnell. Auf dem Android Mobiltelefon ist er nicht ganz so schnell, aber trotzdem sehr gut!

Was haben Google und Apple gut gemacht:

  • Sie haben ein vernünftiges Mobiltelefon-Betriebssystem geschrieben. Nicht nur ich zweifele die Zukunft von Symbian an – Nokia braucht hier länger.
  • Sie haben vernünftige Basisfunktionen implementiert und eine offene API für Programmierer geschaffen. Das wichtigste vernünftig gemacht und die „Features“ anderen Entwicklern überlassen. Meine divise heißt: „Richtig machen oder ganz sein lassen!“ So halbe Sachen haben keine Zukunft und frustrieren nur Nutzer.
  • Intillegente Steuerung (besonders Apple hat es wieder mal allen gezeigt) durch ein Touchscreen und intuitive Gesten.

Was haben Google und Apple schlecht gemacht:

  • Das Mobiltelefon ist erst nach eine Registrierung nutzbar. Apple hat mit ITunes noch einen drauf gesetzt. Ohne ITunes und damit MacOSX oder Windows geht hier nichts!
  • Exklusivverträge mit Mobilfunkprovidern belasten nur die Verbreitung und machen das Produkt schlechter. Ich bin nicht einverstanden mich auf T-Mobile zu beschränken. Ich nutze mehrere Sim-Karten in verschiedenen Ländern und möchte es auch weiter tun.

Was hat Google mit Android gegenüber Apple anders (besser) gemacht:

  • Programme dürfen im Hintergrund arbeiten (ja ich brauche das!)
  • Jedes Programm läuft unter einem eigenen Benutzer. Damit kann kein Programm auf die Daten eines anderen Programmes zugreifen und auch nicht auf ein anderes Programm.
  • Für die Programme werden keine Root-Rechte (ähnlich Administrator unter Windows) benötigt.
  • Vor der Installation erfährt der Benutzer, welche Funktionen des Telefons die Software nutzen wird.
  • Die Programme können ohne Beschränkung auf dem Telefon installiert werden.
  • Java als Programmiersprache ist deutlich besser zu programmieren als Objective-C – jedenfalls meine Meinung.

Da ich von Android begeistert bin, werde ich in dieser Kategorie weitere nützliche Tipps und Programme erwähnen und deren Vor- und Nachteile erläutern … wenn ich Zeit zu finde.

Hilft Eu die EU zu besiegen – Die Suchmaschinen bedrohen die kleine Stadt in Frankreich

Ville d'EuDer heutige Einfluss von Suchmaschinen hat schon lange weltliche Ausmaße erreicht. Jetzt muss sogar ein Stadtname daran glauben. Die Bürgermeisterin der französischen Stadt Eu in der Normandie will ihre Stadt umbennen, um bei den Suchmaschinen besser gefunden zu werden.

Die EU und ihre zahlreichen Organisationen und Behörden haben eine gute Suchmaschinenplatzierung für Ville d’Eu fast unmöglich gemacht. Als einzigen Ausweg sieht die Bürgermeisterin die Umbennenung des Ortes in Ville d’Eu, Eu-le-Château oder Eu-en-Normandie. Dabei hat die Stadt mit ihrem Schlößchen und der langen Tradition auch den lange bestehenden Namen verdient.

Deswegen finde ich die Umbennung als eine schlechte Lösung. Ich denke die Internetgemeinde sollte dem Städtchen zum neuen Ruhm verhelfen und mit ein paar Links (meine habe ich gegeben) die Platzierung der Stadt doch etwas verbessern. Schließlich besteht der Name schon viel länger als die ganz junge EU und diesem Punkt sollte Aufmerksamkeit geschenkt werden.

Ein Link für Eu!

… und wenn ich in der Gegend bin, dann schau ich da bestimmt vorbei. Die Bilder sehen sehr idyllisch aus!

Navigation im Web – The way we search

Trotz seines jungen Alters, hat das Internet innerhalb weniger Jahre eine Durchdringung in der westlichen Welt erreicht, wie kein anderes Medium zuvor. Einer der Gründe für die Verbreitung ist die große Informationsvielfalt, die im Internet jedem kostenlos zur Verfügung steht.

Allerdings war es auch die Vielfalt, die die Unübersichtlichkeit im Web schaffte und Suchmaschinen einen großen Markt eröffnete. Da Listen, Verzeichnisse und „mir bekannte Quellen“ nur einen kleinen Teil des Internets erschließen, werden sehr oft Suchmaschinen wie Google und Yahoo zum Auffinden der Informationen genutzt.
Durch Korrekturen in modernen Suchmaschinen werden Tippfehler (siehe Beispiel) und Schreibfehler korrigiert. Dies führt nicht nur zu besseren Ergebnissen, sondern unterstützt den Nutzer bei der Suche nach Informationen.

Daraus hat sich auch eine Navigationsphilosphie entwickelt, die das Nutzerverhalten im Internet immer mehr bestimmt. Folgende Navigationsphilosophien für den Zugriff auf Internetseiten sind mir bekannt:

  • Seite per bekannte URL (Adresse) aufrufen (z.B.: www.google.de in die Adressleiste des Browsers eingeben)
  • Seite aus persönlichen Lesezeichen oder Favoriten aufrufen (auch Online)
  • Seiten „Ergoogeln“ (der Nutzer gibt den Namen oder Stichwort in eine Suchmaschine ein und betritt über das Suchergebnis die Seite)
  • Seiten von anderen bekannten Seiten aus abrufen (Stichwort: Verlinkung)
  • Seiten aus Webverzeichnissen abrufen

Bei der Eingabe einer URL erhält der Nutzer eine Fehlermeldung von dem Browser, dass die Seite nicht gefunden werden konnte. Durch Korrekturhilfen wird das „Ergoogeln“ der Seiten immer beliebter, weil der Nutzer sich auch verschreiben darf. Die Suchmaschine unterstützt ihn den richtigen Begriff zu finden.

Diese Techniken übertragen sich sehr schnell auf die Navigation in Internetseiten. Im Folgenden stelle ich Techniken für die Navigation auf Internetseiten vor:

  • Navigation über das Menü (die wohl älteste Methode und wegen der Informationsvielfalt immer schwieriger nutzbar)
  • Navigation über den Inhalt (der Nutzer bedient sich Links auf der Internetseite, um weitere Seiten zu erreichen)
  • Navigation über die Sitemap (Sitemap ist ein Verzeichnis von allen Seiten in einem Internetauftritt)
  • Navigation über die Suche (der Nutzer bedient sich der Suchfunktion auf der Internetseite selbst)
  • Navigation über die Suchfunktion des Browsers (Strg+F ist das gängige Tastenkürzel)

Die große Vielfalt der Navigationsmöglichkeiten und die sich immer mehr durchsetzende Navigation über die Suche stellt neue Anforderungen an einen modernen Internetauftritt. Das Zusammenspiel all dieser Techniken, ermöglicht eine nach Benutzer gewohnte Navigation und damit eine sehr effektive Nutzung des Internetauftritts. Diese sollten aus diesem Grund bei modernen Internetauftritten unbedingt umgesetzt werden.

Viele Nutzer erreichen Internetseiten über Suchmaschinen, weil die Seiten als relevant für den Suchbegriff in den Ergebnissen auftauchen. Durch die Vielfalt und die große Menge der Suchergebnisse und vor allem der Informationen auf den Seiten, ist eine schnelle Suche auf den gefunden Seiten sehr wichtig, da wohl kaum ein Nutzer sich die kompletten Inhalte durchliest,  um darüber zu entscheiden, ob diese für ihn relevant sind. Die Suche über die Suchfunktion der Internetseite macht oft weniger Sinn, weil sie oft die selben Ergebnisse wie die externe Suchmaschine zu Tage fördern.

An dieser Stelle kommt die Suchfunktion des Browsers ins Spiel. Durch die Suche auf der gefunden Seite kann der Nutzer relativ schnell für ihn relevante Informationen aufdecken, in dem er den Suchbegriff über die Suche des Browsers auf der Seite findet. Dabei wird oft der Satz oder der Absatz bewertet und nicht der gesamte Inhalt der Seite.
An dieser Stelle muss muss eine effektive Umsetzung der Suche im Browser vorhanden sein. Die altmodische Methode durch ein sich öffnendes (aufpoppendes) Suchfenster stellt mehr eine Behinderung, als eine Hilfe bei der Suche dar, weil sie die Inhalte der Seite selber verdeckt. Firefox Entwickler haben das Problem schon lange erkannt und durch eine Suchleiste (erreichbar über Strg+F) am unteren Rand des Browsers gelöst, welche durch F3 (nach unten suchen) und Shift+F3 (nach oben Suchen) ohne Mauseinsatz bedient werden kann.

Aus diesen und weiteren Gründen ist eine gute Strukturierung der Seiten sehr wichtig und sollte durch Verlinkung spezieller Begriffe auf der eigenen Seite beispielsweise zu Unterseiten durchgeführt werden. Das Navigationsverhalten ist sehr oft entscheidend über den ersten Eindruck der Seite und sollte eine sehr hohe Priorität bekommen.

Die modernen Navigationsmöglichkeiten stellen neue Anforderungen an jeden Internetauftritt dar und sollten möglichst vollständig umgesetzt werden, um so wenig wie möglich Nutzer zu verärgern. Dabei treten Sitemaps und Menüs immer mehr in den Hintergrund, weil sie die Informationsvielfalt nur sehr schwer auffangen können. Die Navigation über die Suche wird immer wichtiger. Dieser Trend lässt sich immer mehr beobachten, weil sich die Informationsvielfalt im Moment nur durch effektive Suchmethoden nutzen lässt.

Sogar auf dem eigenen System (durch Desktop Sucmaschinen) und unternehmensweite Suchmaschinen über alle Informationsquellen des Unternehmens, lässt sich die Problematik der Strukturierung und Sortierung der eigenen Daten erkennen. Der Trend geht dabei immer mehr weg von der Sortierung und Strukturierung von Dokumenten und immer mehr zu effektiven Methoden der Suche, weil der Zeitaufwand und die Disziplin für die Aufgabe immer weniger durchsetzbar werden.

ORM für PHP: Doctrine 1.0 erschienen

Objektorientierte Softwareentwicklung erfodert eine Abbildung der Datenbankstrukturen auf Objektstrukturen. Das unter Java sehr beliebte Framework Hibernate stellt einer der Vorreiter in dieser Entwicklung dar. Durch XML-Konfigurationsdateien werden Datenbankstrukturen auf Objekte in der Anwendung abgebildet.

Seit kurzem ist dier erste stabile Version von Doctrine – einem objektrelationalen Mapping (ORM) für PHP erschienen, welches nach dem Vorbild von Hibernate arbeitet und das Mapping von Daten aus der Datenbank auf Objekte ermöglicht.

Dadurch gewinnt objektorientierte Programmierung auch bei PHP immer mehr an Fahrt und ermöglicht eine besser strukturierte und einfacher zu erweiternde Software.

Weitere Informationen:

Die 25 gefährlichsten Programmierfehler zum Thema Sicherheit

Ein Zusammenschluss von vielen namhaften Firmen hat eine List der 25 gefährlichsten Programmierfehlern veröffentlicht. Mindestens diese sollte sich jeder Programmierer merken und sie nicht mehr machen.

Hier ist der Bericht zu finden:

http://www.sans.org/top25errors/

Natürlich helfen solche Maßnahmen, aber die imperfiktion des Menschen ist das eigentliche Problem und der Ausweg daraus sind ordentliche Tests, die sicher stellen, dass Fehler ausgeschlossen werden.
Folgende Stichpunkte helfen hier weiter:

  • Qualitätssicherung (als Oberbegriff)
  • Unit Tests
  • Sicherheitsanalyse durch Spezialisten