[ https://issues.apache.org/jira/browse/UIMA-1906?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12923847#action_12923847 ]
Marshall Schor commented on UIMA-1906: -------------------------------------- Thanks, Timo. Can you provide a patch for this? > 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 > > 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: > 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 ) {} > } > } > } > 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 > ThreadGroup parent = > Thread.currentThread().getThreadGroup(); > while ( parent.getParent() != null ) > parent = parent.getParent(); > threadInstance = new Thread( parent, new > DaemonThread(), "TestDaemon" ); > (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 is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.