胡长城(银狐999)BLOG

专注SOA,MDA,EAI,BPM,工作流,J2EE;个人主页http://www.javafox.org

胡长城ID:james999
551907次访问,排名71好友0人,关注者50
J2EE,Workflow,BPM,EAI,SOA,工作流
james999的文章
原创 186 篇
翻译 0 篇
转载 2 篇
评论 623 篇
银狐999的公告
个人主要工作流文档可从 javafox live网络硬盘下载

最近评论
cai123mei456:你认识胡长柱么 ?
cai123mei456:你认识胡长柱么 ?
james999:to shendl: 在普元。
james999:to shendl: 在普元。
shendl:胡兄现在在国内公司吗? 什么公司,什么Workflow产品吗?
文章分类
收藏
    相册
    50 Relational Blogs
    Hongsoft博客
    J2EE与ERP禅话
    Peter's Blog
    俠盜躶奔漢
    切尔斯基(RSS)
    动物园的猪
    胡奇
    赵斌BLog
    阿飞外传
    55 Workflow Preacher
    Ekkart Kindler
    Michael zur Muehlen
    Wil van der Aalst
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 重现java.io.IOException: Stream closed异常收藏

    新一篇: 参加“SOA产业链及企业软件趋势研讨会”的感想 | 旧一篇: 终于读完了《杰克·韦尔奇自传》

    上午,美国的QA报告了一个的异常:

    Caused by: java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:235)
    at ........

     这个异常发生在从某一个input stream流读取信息的时候发生的。在我们目前的系统中出现这个异常是比较不正常,特别是这个异常并不是很容易重现。我和本地的QA都没有重现出来。

    虽然不能重现bug,但是凭借经验来说,这个异常是发生在这样一种场景之下:多个线程索引同一个input stream,当某一个thread在执行完之后,把这个inputstream关闭了;而此时正在从这个input stream流中读取信息的线程就会抛出 java.io.IOException: Stream closed 异常。

    我写了一小段测试程序,模拟这个场景,如下:

    public class IOTest {
        
    public static void main(String[] args) {
            File f 
    = new File("c:/test/StoreTest-1.xml");
            java.io.BufferedReader br 
    = null;
            
    try {
                br 
    = new java.io.BufferedReader(new java.io.FileReader(f));
            }
     catch (FileNotFoundException e) {}

            
    final java.io.BufferedReader br1 = br;
            
    final java.io.BufferedReader br2 = br;

            Thread t 
    = new Thread() {
                
    public void run() {
                    
    try {
                        
    for (String line = null; (line = br1.readLine()) != null;) {
                            System.out.println(
    "Process stdout: " );
                            
    try {
                                Thread.sleep(
    1000);
                            }
     catch (InterruptedException e) {}
                        }

                    }
     catch (IOException ioe) {
                        ioe.printStackTrace();
                    }

                }

            }
    ;

            Thread t2 
    = new Thread() {
                
    public void run() {
                    
    try {
                        
    for (String line = null; (line = br2.readLine()) != null;) {}
                        System.out.println(
    "Process stdout2: ");
                        br2.close();
                    }
     catch (IOException ioe) {
                        ioe.printStackTrace();
                    }

                }

            }
    ;

            t.start();
            t2.start();
        }

    }

    当执行这段程序之后,会看到如下输出:
    Process stdout:
    Process stdout2:
    java.io.IOException: Stream closed
     at java.io.BufferedReader.ensureOpen(BufferedReader.java:97)
     at java.io.BufferedReader.readLine(BufferedReader.java:293)
     at java.io.BufferedReader.readLine(BufferedReader.java:362)
     at test.common.util.IOTest$1.run(IOTest.java:38)

    发表于 @ 2007年04月26日 21:13:00|评论(loading...)|编辑

    新一篇: 参加“SOA产业链及企业软件趋势研讨会”的感想 | 旧一篇: 终于读完了《杰克·韦尔奇自传》

    评论

    #xuse1 发表于2007-04-27 11:12:55  IP: 221.12.171.*
    编程习惯问题,在哪里开,自然要在哪里关。
    所以程序员最重要的就是编码规范。
    开门关门必须写在一个方法里。
    #zhong_jinfeng 发表于2007-04-27 21:47:32  IP: 125.95.22.*
    楼上的,这个问题不是编程习惯,而是用这个东西的编码或者设计人员水平不过硬。

    其实这个问题属于一般性的带缓冲的I/O流,带缓冲的东西基本都不是线程安全的,如果这个基础知识都不知道,那就是java 语言不过关的问题。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 银狐999