簡體   English   中英

在Java中的可運行類構造函數中傳遞值

[英]Passing values in runnable class constructor in Java

我希望有人可以幫助我確定下面的代碼在哪里出了問題。

public class CCFileImpl implements CCFileAbs {

    private LogMe logMe = null;
    private ExecutorService ccfileimpl_exsc = null;
    private CCProcessorImpl cProc = null;
    private DataUtil dUtil = null;

    public CCFileImpl() {
        this.logMe = LogMe.getLogger();
        if (dUtil == null) {
            dUtil = new DataUtil();
        }
    }

    @Override
    public void getFilesForProcess() {

        CCHeader cHead = null;
        Future future = null;

        String sPath = PropReader.getPropValue(PropReader.FILEDIR); //D:\samples\

        int iCtr = 0;

        ccfileimpl_exsc = Executors.newFixedThreadPool(Integer.parseInt(PropReader.getPropValue(PropReader.TPool_File)));
        Date dToday = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");

        Iterator iter = dUtil.getFilesForProcess(sdf.format(dToday)).iterator();

        String sFileGroupName = "", sFileName = "";
        String sId = null; //"testFiles";

        while (iter.hasNext()) {
            cHead = (CCHeader) iter.next();

            sFileName = cHead.getsFileName(); //(String) iter.next();
            sId = cHead.getsId();

            sFileGroupName = sFileName + "_" + iCtr++;

            dUtil.updTPDHDRStatusById(sId); //Interface utility class // <=== And also here, when trying to update the db
                                                                      // nothing happened.

            cProc = new CCProcessorImpl(sId, sFileGroupName, sPath, sFileName);  // <=== Problem is here?
            future = ccfileimpl_exsc.submit(cProc);
        }
        ccfileimpl_exsc.shutdown();
    }
}

上面的代碼檢索文件進行處理,然后將其分配給可運行類(如下),然后將其提交給executorService類。

現在,我不明白為什么將構造函數的傳遞值(以下)設置為null / space,而只有sPath變量具有確定的值。

public class CCProcessorImpl implements Runnable{

    private CCFileParser rpsCCParser;
    private ExecutorService ccprocimpl_exsc;
    private static LogMe logMe;
    private final String sGroupName;
    private final String sId;
    private final String sFileName;

    @Override
    public void run() {
        this.parseFiles(sId, sFileName);
    }

    public CCProcessorImpl(String sId, String sGroupName, String sPath, String sFileName) {
        this.logMe = LogMe.getLogger();
        this.sId = sId;
        this.sGroupName = sGroupName;
        this.sFileName = sPath + sFileName;
    }

    public void parseFiles(String sId, String sFileName) {
        try {

            Future future = null;

            rpsCCParser = new CCFileParser(sId, sFileName);
            ArrayList aList = rpsCCParser.getFileContent();

            String sGroupName = sId + "_";

            ccprocimpl_exsc = Executors.newFixedThreadPool(Integer.parseInt(PropReader.getPropValue(PropReader.TPool_Content)));


            int iStart = 0, iSize = 9, iEnd = iSize;
            for (int iCtr = 0; iCtr <= ((aList.size() / 10) - 1); iCtr++, iStart += iSize, iEnd += iSize) {

                future = ccprocimpl_exsc.submit(new CCUpdater(aList.subList(iStart, iEnd), sGroupName + iCtr));

            }

            future.get();

            ccprocimpl_exsc.shutdown();
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException ie) {
            throw new RuntimeException(ie);
        }
    }
}

另外,作為補充問題,為什么在我嘗試更新數據庫表時未執行任何更新? 這是否與線程環境有關?

為什么不使用ccfileimpl_exsc.submit()返回的期貨? 而是在提交作業后立即調用ccfileimpl_exsc.shutdown() ,並在作業完成前將其殺死。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM