javalmax

Why doesn't my program stop even when i call disruptor.shutdown


i have been try to use the LMAX distruptor to buffer the content produced by one of my programs and publish them to another program as a batch of records (well i am still unable to get the consumer batching part done). But even without using the batching of the records, it works as it should be. But my problem is eventhough i used call the

`disruptor.shutdown()` and  `executorService.shutdownNow()`

as it is given in one of the examples, it doesn't stop executing the program. It does even execute statement below those methods as well. When i print

executorService.isShutdown();

it returns true. Can someone help me with this...

Edit

"pool-1-thread-1" prio=10 tid=0x00007f57581b9800 nid=0x1bec waiting on condition [0x00007f573eb0d000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000d9110148> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at com.lmax.disruptor.BlockingWaitStrategy.waitFor(BlockingWaitStrategy.java:45)
    at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:55)
    at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:123)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

Solution

  • Your Java Process only stops, when all threads (that are non daemon threads) are finished. Probably some thread is still running, maybe in a lock, maybe in a loop.

    To see what thread are still running you can use the jdk-tools:

    Use jps to get the ids of running Java processes:

    C:\DVE\jdk\jdk8u45x64\jdk1.8.0_45\bin>jps
    4112 TestExMain
    

    With the right id for your program use the command jstack:

    C:\DVE\jdk\jdk8u45x64\jdk1.8.0_45\bin>jstack 4112
    2015-09-17 09:12:45
    Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.45-b02 mixed mode):
    
    "Service Thread" #9 daemon prio=9 os_prio=0 tid=0x000000001d208800 nid=0x1b7c runnable [0x0000000000000000]
       java.lang.Thread.State: RUNNABLE
    
    "main" #1 prio=5 os_prio=0 tid=0x0000000002260800 nid=0x1324 waiting on condition [0x000000000224f000]
       java.lang.Thread.State: TIMED_WAITING (sleeping)
            at java.lang.Thread.sleep(Native Method)
            at com.example.TestExMain.main(TestExMain.java:8)
    

    For example, here you'll see a thread Service Thread which is a daemon - this thread wont stop your program from shutting down. The Thread main is not a daemon thread - the Java-Process will wait for this thread to finish, before it stops. For each thread you'll see a stack trace, at which position the thread is - with that you can find the code that possible keeps the thread from running.


    That specific Thread you have there is somehow locked (im not shure why, it could be a wait() call, a synchronize block or some other locking mechanism). When that thread doesn't stop when you call disruptor.shutdown() it might be a bug in that lib you use.