[
https://issues.apache.org/jira/browse/UIMA-1906?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17494701#comment-17494701
]
Richard Eckart de Castilho commented on UIMA-1906:
--------------------------------------------------
Sorry that the patch was never applied - looks like it somehow fell off the
radar.
This has now been superseded by UIMA-6412 which drops the ThreadGroup entirely
and works with an executor service.
> Daemon thread prevents CPE exit
> -------------------------------
>
> Key: UIMA-1906
> URL: https://issues.apache.org/jira/browse/UIMA-1906
> Project: UIMA
> Issue Type: Bug
> Components: Collection Processing
> Affects Versions: 2.3
> Reporter: Timo Boehme
> Priority: Major
> Attachments: CPMEngine.diff, cpm_messages.diff
>
>
> If a daemon thread was started within an AE and keeps running independent of
> the AE processing (e.g. bound to a static variable) it prevents exiting of
> the CPE.
> Simple test:
> add following class to a AE:
> {noformat}
> static class DaemonThread implements Runnable {
> private static volatile Thread threadInstance;
> /** Creates a daemon thread if it not already exists. */
> public synchronized static void startThread() {
> if ( threadInstance == null ) {
> threadInstance = new Thread( new DaemonThread(),
> "TestDaemon" );
> threadInstance.setDaemon( true );
> threadInstance.start();
> }
> }
> @Override
> public void run() {
> while ( true ) {
> try { Thread.sleep( 2000 ); } catch (
> InterruptedException ie ) {}
> }
> }
> }
> {noformat}
> and call DaemonThread.startThread(); within the process() method.
> After CPE signals collectionProcesscomplete() the application does not exit.
> The reason: in org.apache.uima.collection.impl.cpm.engine.CPMEngine a
> threadGroupDestroyer thread is created (line 2522) which waits for threads to
> die. Since it does not check for daemon threads it counts them as normal
> threads to wait for and thus it waits forever (this can be seen with kill -3
> PID to get a JAVA stack trace of all threads under UNIX).
> A workaround would be to put the daemon thread in another ThreadGroup. In the
> example if you create the tread with
> {noformat}
> ThreadGroup parent =
> Thread.currentThread().getThreadGroup();
> while ( parent.getParent() != null )
> parent = parent.getParent();
> threadInstance = new Thread( parent, new
> DaemonThread(), "TestDaemon" );
> {noformat}
> (in the top most thread group) the CPE exits normally.
> However this is not possible with closed source libraries.
> Thus the threadGroupDestroyer must test for daemon threads. Furthermore the
> used group.activeCount() (in
> org.apache.uima.collection.impl.cpm.engine.CPMEngine) should only be used for
> information purposes - as the javadoc states - not for relying on it as a
> loop parameter.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)