You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@uima.apache.org by "li Gongrong (Jira)" <de...@uima.apache.org> on 2019/09/25 12:37:00 UTC

[jira] [Comment Edited] (UIMA-6129) The thread may deadlock if other thread interrupted which use jcas

    [ https://issues.apache.org/jira/browse/UIMA-6129?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16937686#comment-16937686 ] 

li Gongrong edited comment on UIMA-6129 at 9/25/19 12:36 PM:
-------------------------------------------------------------

{code:java}
package com.test.uima;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.apache.uima.UIMAException;
import org.apache.uima.fit.factory.JCasFactory;
import org.apache.uima.fit.util.JCasUtil;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.tcas.Annotation;

public class Main {


    public static void main(String[] args) throws UIMAException {
        JCas jcas = JCasFactory.createJCas();
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        jcas.setDocumentText("abcdefg");
        FutureTask<String> future = new FutureTask<>( () -> {
            long t = System.currentTimeMillis();
            while (System.currentTimeMillis() - t <= 1000L) {
                Annotation annotation  = new Annotation(jcas, 0, 2);
                annotation.addToIndexes(jcas);
            }
            return "success";
        });

        executorService.execute(future);

        try {
            future.get(20, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            future.cancel(true);
            e.printStackTrace();
        }
        System.out.println(JCasUtil.select(jcas, Annotation.class).size());
        System.out.println("Finished select");
        System.out.println(JCasUtil.selectCovered(jcas, Annotation.class, 0, 5));
        System.out.println("Finished select covered");
        System.out.println(JCasUtil.selectCovering(jcas, Annotation.class, 0, 1));
        System.out.println("Finished select covering ");
        executorService.shutdown();
    }
}

{code}
I can't recurrent  the jstack in my complex code, but the simple code may caused *ConcurrentModificationException* , is it the same exception? when i do some thing in JCas index and the kill the thread, it will case multy thread exceptions?

 

uima version: 2.8.1

openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

 


was (Author: gongrong):
{code:java}
package com.test.uima;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import org.apache.uima.UIMAException;
import org.apache.uima.fit.factory.JCasFactory;
import org.apache.uima.fit.util.JCasUtil;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.tcas.Annotation;

public class Main {


    public static void main(String[] args) throws UIMAException {
        JCas jcas = JCasFactory.createJCas();
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        jcas.setDocumentText("abcdefg");
        FutureTask<String> future = new FutureTask<>( () -> {
            long t = System.currentTimeMillis();
            while (System.currentTimeMillis() - t <= 1000L) {
                Annotation annotation  = new Annotation(jcas, 0, 2);
                annotation.addToIndexes(jcas);
            }
            return "success";
        });

        executorService.execute(future);

        try {
            future.get(20, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            future.cancel(true);
            e.printStackTrace();
        }
        System.out.println(JCasUtil.select(jcas, Annotation.class).size());
        System.out.println("Finished select");
        System.out.println(JCasUtil.selectCovered(jcas, Annotation.class, 0, 5));
        System.out.println("Finished select covered");
        System.out.println(JCasUtil.selectCovering(jcas, Annotation.class, 0, 1));
        System.out.println("Finished select covering ");
        executorService.shutdown();
    }
}

{code}
I can't recurrent  the jstack in my complex code, but the simple code may caused *ConcurrentModificationException* , is it the same exception? when i do some thing in JCas index and the kill the thread, it will case multy thread exceptions?

> The thread may deadlock if other thread interrupted which use jcas 
> -------------------------------------------------------------------
>
>                 Key: UIMA-6129
>                 URL: https://issues.apache.org/jira/browse/UIMA-6129
>             Project: UIMA
>          Issue Type: Bug
>          Components: UIMA
>    Affects Versions: 2.10.4SDK
>            Reporter: li Gongrong
>            Priority: Major
>
> I use FutureTask to kill the thread spend a lot of time,but it will cause deadlock.
> {code:java}
> at sun.misc.Unsafe.park(Native Method)at sun.misc.Unsafe.park(Native Method) - parking to wait for  <0x000000070435e808> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at org.apache.uima.jcas.impl.JCasHashMapSubMap.getReserve(JCasHashMapSubMap.java:303) at org.apache.uima.jcas.impl.JCasHashMap.getReserve(JCasHashMap.java:318) at org.apache.uima.jcas.impl.JCasImpl.getJfsFromCaddr(JCasImpl.java:1154) at org.apache.uima.jcas.impl.JCasImpl$JCasFsGenerator.createFS(JCasImpl.java:912) at org.apache.uima.jcas.impl.JCasImpl$JCasFsGenerator.createFS(JCasImpl.java:873) at org.apache.uima.cas.impl.CASImpl.ll_getFSForRef(CASImpl.java:3751) at org.apache.uima.cas.impl.CASImpl.createFS(CASImpl.java:2231) at org.apache.uima.cas.impl.FSIteratorWrapper.get(FSIteratorWrapper.java:63) at org.apache.uima.cas.impl.FSIteratorAggregate.get(FSIteratorAggregate.java:76) at org.apache.uima.cas.impl.FSIteratorImplBase.next(FSIteratorImplBase.java:66) at org.apache.uima.cas.impl.FSIteratorImplBase.next(FSIteratorImplBase.java:32)
> {code}
> why ?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)