A múltkori, nagy sikerű írásom hatására Tompika küldött nekem egy hasonlóan izgalmas problémát.
1 2 3 4 | while (true) { Process p = Runtime.getRuntime().exec("macska"); p.waitFor(); } |
A kód eredeti, Tompika kedvenc állatait, a macskákat felemlegetve. A kód elméletben a következőt kellene, hogy csinálja: az első sor a p referenciával elérhető módon indít egy processzt; míg a második sor vár, amíg a processz fut.
Ha megnézzük a kapcsolódó JavaDoc kommenteket, ez így működőképes is lehet. Ezzel szemben futásidőben problémák léptek fel, amiket feltehetőleg a következő kódrészletre való kicserélés javított:
1 2 3 4 5 6 7 8 9 | while (true) { Process p = Runtime.getRuntime().exec("macska"); p.waitFor(); p.getErrorStream().close(); p.getOutputStream().close(); p.getInputStream().close(); p.destroy(); } |
A kódrészlet utolsó sora vicces. Idézném a Javadoc kommentet:
public abstract void destroy()Kills the subprocess. The subprocess represented by this
Processobject is forcibly terminated.
Amit én úgy értelmeznék, hogy a függvényt meghívva explicite lezárom a Processt. Viszont állítólag nem így történik. Valaki tudja a magyarázatot? Kíváncsi lennék rá.
PS.: ha valaki hozzájut hasonló gyöngyszemekhez, és eljuttatja hozzám, szívesen közzéteszem.
Kommentek