使用ThreadPoolExecutor运行java的Java ProcessBuilder在ubuntu上无法正常工作

时间:2012-03-07 18:52:40

标签: java multithreading ubuntu processbuilder

在某天运行应用程序后,我发现在/ 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位服务器VM(内置20.1-b02,混合模式)       Linux ubuntu 2.6.32-36-server#79-Ubuntu SMP Tue Nov 8月22日22:44:38 UTC 2011 x86_64 GNU / Linux

但是在Windows 7专业版32位上运行的相同的jar正常工作

  

java版“1.6.0_22”   Java(TM)SE运行时环境(版本1.6.0_22-b04)   Java HotSpot(TM)客户端VM(版本17.1-b03,混合模式)

我有一个使用ThreadPoolExecutor来处理某些对象的多线程Java应用程序(APP1)。 当我从命令行在Linux上运行它时,它按预期工作。然后我编写了另一个使用ProcessBuilder.start执行多线程应用程序的java应用程序(APP2)。

当我使用APP2运行APP1时,我发现APP1中ThreadPoolExecutor的行为不同,其中一些线程与旧数据重复使用不止一次。 我的代码是这样的: 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);
            }
        }
    }
    }

当我检查日志文件时,我发现线程名称使用相同的数据ID运行两次,当我从命令行正常运行App1时,它永远不会发生。

之前有没有人遇到过这样的行为?

0 个答案:

没有答案