I have an example java code below which, if it runs as a console application, behaves as I expected (creating a single thread to run runnable).
Strange behavior (spawning two threads - example below) I see when I run this sample as a service application using Apache prunsrv64.exe.
I am testing this on a Windows 7 - 64bit machine.
Output Example:
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
Code example:
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(); } } } }); } }
Thanks.
Update: To clarify, I call this code as follows:
ExecutorTest tester = new ExecutorTest(); tester.testIt();
The same code, without changes, behaves differently when run as a console application and a service application, as I mentioned above.
Update 2: I added a second tester that uses the ScheduledExecutorService. The behavior of the same.
Update 2:
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 code 2:
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 logging to add authentication 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