TestInOut

目前这个程序例子还有点问题,也可能是我自己拼写错误。今天加班,等明天看有时间了再看看。

 

 

 

发生两个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元素的操作语句
      }
      在循环里面定义数组,每次会生成一个对象,效率低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值