2013-08-06 10 views
5

Ich benutze com.sun.net.httpserver.HttpServer, um einen kleinen Container zum Testen von Bits von Servercode zu erstellen, und habe Probleme damit, mehr als einen Thread zur Bearbeitung von Anfragen zu verwenden.Wie bekomme ich HttpServer, um mehrere HttpHandlers parallel zu erstellen?

Ich rufe java.util.concurrent.Executors.newFixedThreadPool (20) auf, um einen java.util.concurrent.ThreadPoolExecutor mit 20 Threads zu erstellen. Dann setze ich diesen Executor auf dem HttpServer. Mit Jmeter feuere ich 20 Client-Threads ab, um eine Anforderung an die einzige HttpHandler-Implementierung auf dem Server zu senden. Das Handler funktioniert ein System.out.println (this) und ich diese Ausgabe zu sehen:

Started TestServer at port 8800 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

Ich dachte, ich 20 sehen würde (oder fast 20) verschiedene Threads hier verwendet werden. Hier ist der Code.

Ich möchte, dass der HttpServer mehrere TestHandler parallel erstellt, um die mehreren gleichzeitigen Anfragen zu bedienen. Was fehlt mir hier?

(BTW, das ist ganz ähnlich wie Can I make a Java HttpServer threaded/process requests in parallel?, obwohl die Antwort auf diese Frage ist ein Vollstrecker zu verwenden, die ich bereits tue. Dank.)

+0

Ist es möglich, dass jede Anfrage schnell genug bearbeitet wird, damit der Executor denselben Thread weiterverwenden kann? Können Sie Ihrem Handler etwas Verzögerung hinzufügen, um zu sehen, ob sich etwas ändert? – elevine

+0

@elevine: Ich habe darüber nachgedacht, also ein 'Thread.sleep (1000)' zu TestHandler.handle (HttpExchange) hinzugefügt. Gleiches Ergebnis. Vielen Dank. – Michael

Antwort

2

Die gleiche Instanz eines runnable mehrere Male ausgeführt werden kann, in verschiedene Themen. Weitere Informationen finden Sie unter Initializing two threads with the same instance of a runnable.

Was Sie in Ihrem Beispiel drucken, ist die HttpHandler-Informationen, aber nichts darüber, in welchem ​​Thread ausgeführt wird. Und diese Information ändert sich nicht, da der Server immer dasselbe Objekt für alle Threads wiederverwendet.

Wenn Sie die Thread-ID drucken Sie verwenden können:

long threadId = Thread.currentThread().getId(); 
System.out.println(threadId); 

ThreadID sollte wie erwartet ändern.

Verwandte Themen