我们在调用Process的waitFor()时经常会遇到明明Process已经结束了,但是waitFor()还是阻塞在那里,那是因为Process的inputStream缓存造成的,我们现在另外再起一个线程,来监控我们的Process,实时清空缓存就可以解决这个问题了。class WatchThread extends Thread { Process p; boolean over; ArrayList<String> stream; public WatchThread(Process p) { this.p = p; over = false; stream = new ArrayList<String>(); } public void run() { try { if(p == null)return; Scanner br = new Scanner(p.getInputStream()); while (true) { if (p==null || over) break; while(br.hasNextLine()){ String tempStream = br.nextLine(); if(tempStream.trim()==null||tempStream.trim().equals(""))continue; stream.add(tempStream); } } } catch(Exception e){e.printStackTrace();} } public void setOver(boolean over) { this.over = over; } public ArrayList<String> getStream() { return stream; } }
这样,即清空了inputStream,又不会造成需要的人无法获取inputStream的信息,waitFor()阻塞的问题也解决了。
WatchThread wt = new WatchThread(p); wt.start();<span style="font-size:24px;"></span><pre name="code" class="java">在waitFor之前插入
在waitFor后之后插入
- ArrayList<String> commandStream = wt.getStream();
- wt.setOver(true);
Process 的 waitFor() 造成的阻塞
最新推荐文章于 2023-11-06 16:03:21 发布