目前这个程序例子还有点问题,也可能是我自己拼写错误。今天加班,等明天看有时间了再看看。
发生两个java进程在运行,父进程结束后,子进程还在继续运行。
import java.io.*;
public class TestInOut implements Runnable {
Process p = null;
public TestInOut(){
try{
p = Runtime.getRuntime().exec("java MyTest");
//这里的new TestInOut()不能这么写,很危险,可能产生无限递归。
//而且process的对象也不是一个,用this表达。
//new Thread(new TestInOut()).start();
new Thread(this).start();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
TestInOut tio = new TestInOut();
tio.send();
}
public void send(){
try{
OutputStream ops = p.getOutputStream();
while(true){
ops.write("help/r/n".getBytes());
}
}catch(Exception e){
e.printStackTrace();
}
}
public void run(){
try{
InputStream ips = p.getInputStream();
BufferedReader bfr = new BufferedReader(new InputStreamReader(ips));
while(true){
String strLine = bfr.readLine();
if(strLine != null){
System.out.println(strLine);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
//错误的
public class MyTest{
public static void main(String[] args) throws Exception {
while(true){
System.out.println("hi:" +
new BufferedReader(new InputStreamReader(System.in)).readLine());
if(strLine != null){
System.out.println("hi:" + strLine);
}else{
return;
}
}
}
}
验证管道缓冲区满后,将发生下面的哪种情况:
1.新的数据写入时,将最前面写入的数据挤出去,从而发生数据丢失。
2.与PipedInputStream相连的PipedOutputStream无法再写入新的数据,PipedOutputStream.write方法处于阻塞状态。
3.与PipedInputStream相连的PipedOutputStream无法再写入新的数据,PipedOutputStream.write方法抛出异常。
属于阻塞对象。
new BufferedReader(new InputStreamReader(System.in))没有close管道。
如果close的话System.in相关的资源也关掉了。
程序代码的放置位置是非常重要的。
用java程序启动子进程的时候一定要在父进程结束的时候让子进程结束。
编程的时候脑子里要想的是对象。
记住调用Process类的destroy方法结束子进程的运行。
在程序中创建子进程比较常见。
提高程序的运行效率:
1.for(int i=0;i<str.length();i++){
......
}
与下面代码的比较:
int len=strlength();
for(int i=0;i<len;i++){
......
}
上面的没有下面的运行效率高,上面的代码每次需要检测str.length()。
2.byte[] buf = new byte[1024];
while(true){
对buf元素的操作语句
}
与下面代码的比较:
while(true){
byte[] buf = new byte[1024];
对buf元素的操作语句
}
在循环里面定义数组,每次会生成一个对象,效率低。