Warum erzeugt Java ExecutorService newSingleThreadExecutor zwei Threads?

Ich habe einen Java-Beispielcode, der sich bei Ausführung als Konsolenanwendung wie erwartet verhält (beim Ausführen der ausführbaren Datei wird ein einzelner Thread erzeugt).

Das seltsame Verhalten (zwei Threads werden erzeugt - Beispiel unten) wird angezeigt, wenn ich dieses Beispiel als Dienstanwendung mit prunsrv64.exe von Apache ausführe.

ch teste dies auf einem Windows 7-Computer - 64-Bi

Sample Output:

   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();
                    }                   
                }

            }
        });     
    }
}

Vielen Dank

Update: Zur Verdeutlichung rufe ich diesen Code wie folgt auf:

    ExecutorTest tester = new ExecutorTest();
    tester.testIt();

Derselbe Code ohne Änderungen verhält sich anders, wenn er als Konsolenanwendung und als Dienstanwendung wie oben erwähnt ausgeführt wird.

Update 2: Ich habe einen zweiten Tester hinzugefügt, der einen ScheduledExecutorService verwendet. Das Verhalten ist das gleiche.

Update2 Ausgabe:

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: Geänderte Protokollierung zum Hinzufügen von Identitäts-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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage