java - ProcessBuilder øger håndtællingen, når den udføres

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et problem, når jeg udfører ProcessBuilder i Java JDK 1.7 i Windows 7 64. Jeg fandt ud af, at håndtagetællingen er stigende, da jeg tjekker Windows Task Manager. Trådantalet øgedes ikke.Jeg forsøgte også i JDK 1.8.Men det havde samme problem.Jeg prøvede mange kildeprøver fra nettet, så det kun øger et håndtag nu. Men jeg kan ikke reducere det sidste håndtag indtil nu. Jeg har forsøgt at finde vej til at løse dette overalt. Men jeg kunne ikke finde. Er der nogen der ved, hvordan man løser dette problem? Kontroller nedenfor kilden.


[[Eksempel på Windows-opgaveadministrator]]

navn/PID/brugernavn/CPU/håndtag (åbne filer)/tråd

javaw.exe/10388/XXX/00/1038/47


Jeg har en oplevelse om 'for mange åbne filer' problem i Linux. Jeg løst det ved at ændre kilden, der opstod. Så jeg kontrollerede det i Windows også. Jeg synes, det er et problem, hvis håndtaget tæller for evigt. Min kunde gav mig exe (jar) programmet. Så jeg skal ringe programmet hver gang for at sende SMS-besked. Jeg er bekymret for håndtaget vil øge mange, så der mangler OS-hukommelses ressource mangel.
(* Jeg har ændret min underkilde af Guillaume Fs råd.)


boolean sendYn = false;
Process p = null;
try {
    String process\_string = "";

     List<String> commands = new ArrayList<String>();
     commands.add(sBatchName);
     commands.add(sTelphon);
     commands.add(sMessage);

     ProcessBuilder pb = new ProcessBuilder(commands);
     p = pb.start();//** handle increse 4

     input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     while ((process = input.readLine()) != null) {
            if(process.equals("[send\_success]")){
                //sucess
                sendYn = true;
                process = null;
                break;
            }else {
            //fail 
                sendYn = false;
                process = null;
                break;
            }
    }   
    //input.close();// decrease one
    //input = null;
    //int result = p.waitFor();

    p.getErrorStream().close();// decrease one 
    p.getInputStream().close();// decrease one
    p.getOutputStream().close();//decrease one 
    //p.destroy();

}catch(Exception e1){

    //if(input != null){
    //  input.close();  
    //}

    if(p != null){
        p.getErrorStream().close();
        p.getInputStream().close();
        p.getOutputStream().close();
    }

} finally {
    p.waitFor();
    p.destroy();
}

Bedste reference