Java ProcessBuilder для запуска Java с ThreadPoolExecutor не работает должным образом на Ubuntu - PullRequest
1 голос
/ 07 марта 2012

После запуска приложения в течение нескольких дней я обнаружил, что в папке / root создается некоторый отчет о сбое JVM. Файл журнала начинается с этой информации

# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f050013cdeb, pid=31295, tid=139659437045504
#
# JRE version: 6.0_26-b03
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.1-b02 mixed mode linux-amd64     compressed oops)
# Problematic frame:
# C  [libc.so.6+0x86deb]  unsigned long+0x15b
#

Я обнаружил, что приведенное ниже поведение происходит тольков Ubuntu

java версия "1.6.0_26" Java (TM) среда выполнения SE (сборка 1.6.0_26-b03) Java HotSpot (TM) 64-битная виртуальная машина сервера (сборка 20.1-b02, смешаннаярежим) Linux Ubuntu 2.6.32-36-сервер # 79-Ubuntu SMP Вт 8 ноября 22:44:38 UTC 2011 x86_64 GNU / Linux

Но те же самые jar-файлы работают на 32-битной Windows 7 professional работает правильно

Java-версия "1.6.0_22" Java (TM) SE Runtime Environment (сборка 1.6.0_22-b04) Java HotSpot (TM) Клиентская виртуальная машина (сборка 17.1-b03, смешанный режим)

У меня есть многопоточное Java-приложение (APP1), использующее ThreadPoolExecutor для обработки некоторых объектов.Когда я запускаю его на Linux из командной строки, он работает как положено.Затем я написал другое приложение Java (APP2), которое использует ProcessBuilder.start для выполнения многопоточного приложения.

Когда я использую APP2 для запуска APP1, я обнаружил, что поведение ThreadPoolExecutor в APP1 отличается, гденекоторые потоки повторно используются со своими старыми данными более одного раза.мой код выглядит примерно так: App1:

    myProcessor processor = new myProcessor(data);
    threadExecuter.execute(processor);

myProcessor реализует runnable, и данные хранятся там в закрытой переменной.

Это код myProcessor class

    private class myProcessor implements Runnable {
    public myProcessor(Data data)
    {
    myData=data;
    }

    private Data myData;

DataDAO datadao=new DataDAO();

    public void run() {
        Boolean processed = false;
        if (myData != null) {
            if(Logger.isDebug())
            {
                Logger.logInfo("-- thread:"+ Thread.currentThread().getName()+" processing "+myData.getId());
            }
            processed = dataHandler.process(myData.getMade(), myData.getText(), myData.getSc().getComp(), myData.getSc(), myData.getOp(),myData.getId());
            myData.setProcessed(processed);
            myData.setStatus(1);
            try {
                if(myData.isProcessed()) datadao.UpdateProcessedStatus(myData);
            } catch (SQLException ex) {
                Logger.logError(ex);
            }
        }
    }
    }

Когда я проверяю файл журнала, я обнаруживаю, что имя потока запускается дважды с одним и тем же идентификатором данных, чего не происходит при обычном запуске App1 из командной строки.

Сделалкто-нибудь сталкивался с таким поведением раньше?

...