Ich habe einen Beispiel-Java-Code, unter dem, wenn als eine Konsole-Anwendung ausgeführt wird, verhält sich wie ich erwartet (spawning einen einzelnen Thread, um die ausführbare ausführen).Warum erzeugt der Java ExecutorService newSingleThreadExecutor zwei Threads?
Das seltsame Verhalten (spawning zwei Threads - Beispiel unten) Ich sehe ist, wenn ich dieses Beispiel als eine Dienstanwendung mit Apache prunsrv64.exe ausführen.
Ich teste dies auf einem Windows 7-Rechner - 64bit.
Beispielausgabe:
Thread -28 Current time: 09:50:11 AM
Thread -52 Current time: 09:50:12 AM
Thread -28 Current time: 09:50:21 AM
Thread -52 Current time: 09:50:22 AM
Thread -28 Current time: 09:50:31 AM
Thread -52 Current time: 09:50:32 AM
Beispielcode:
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorTest{
public void testIt(){
ExecutorService ex = Executors.newSingleThreadExecutor();
ex.execute(new Runnable(){
public void run() {
while(true){
System.out.printf("Thread -" + Thread.currentThread().getId() + " Current time: %tr%n", new Date());
try{
Thread.sleep(10000);
}catch(InterruptedException ie){
ie.printStackTrace();
}
}
}
});
}
}
Dank.
Update: Nur um zu klären ich diesen Code nenne wie folgt:
ExecutorTest tester = new ExecutorTest();
tester.testIt();
Der gleiche Code ohne Änderungen verhält anders, wenn sie als Konsolenanwendung und eine Dienstanwendung ausgeführt werden, wie ich oben erwähnt.
Update 2: I gegeben, um eine zweite Testgerät, das eine ScheduledExecutorService verwendet. Das Verhalten ist das gleiche.
Update2 Ausgang:
Using ScheduledExecutorService.
Thread Id outside Runnable -1
Thread -53 Current time: 10:58:15 AM
Thread -28 Current time: 10:58:24 AM
Thread -53 Current time: 10:58:25 AM
Thread -28 Current time: 10:58:34 AM
Thread -53 Current time: 10:58:35 AM
Thread -28 Current time: 10:58:44 AM
Thread -53 Current time: 10:58:45 AM
Thread -28 Current time: 10:58:54 AM
Thread -53 Current time: 10:58:55 AM
Thread -28 Current time: 10:59:04 AM
Thread -53 Current time: 10:59:05 AM
Update 2 Code:
public void testItWithScheduled(){
System.out.println("Using ScheduledExecutorService.");
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
System.out.println("Thread Id outside Runnable -" + Thread.currentThread().getId());
ex.scheduleWithFixedDelay(new Runnable(){
public void run() {
System.out.printf("Thread -" + Thread.currentThread().getId() + " Current time: %tr%n", new Date());
}
},0L, 10, TimeUnit.SECONDS);
}
called through:
ExecutorTest tester = new ExecutorTest();
tester.testItWithScheduled();
Update 3: Modified Protokollierung Identität Hash
Using ScheduledExecutorService.
Thread Id outside Runnable 1 with reference: 1370756928
Thread -53 Current time: 11:10:38 AM with reference: 1370756928
Thread -28 Current time: 11:10:47 AM with reference: 1939972532
Thread -53 Current time: 11:10:48 AM with reference: 1370756928
Thread -28 Current time: 11:10:57 AM with reference: 1939972532
Thread -53 Current time: 11:10:58 AM with reference: 1370756928
Thread -28 Current time: 11:11:07 AM with reference: 1939972532
Thread -53 Current time: 11:11:08 AM with reference: 1370756928
Wahrscheinlich rufst du 'testIt' schon zweimal an? –
Ich würde annehmen, dass Ihr Hauptthread das Programm ausführt, und dann erstellen Sie die 'Executors.newSingleThreadExecutor();' die einen anderen Thread erstellt. Daraus ergeben sich zwei Threads. –
Erhalten Sie 2 verschiedene Thread-IDs, wenn Sie einen Ausdruck von getId() direkt vor der while-Schleife platzieren? – brummfondel