【问题标题】:Java input stream "blocking" and multithreadingJava 输入流“阻塞”和多线程
【发布时间】:2011-12-23 06:23:26
【问题描述】:

似乎找不到任何关于输入流“阻塞”的信息,它既描述了它是什么,也描述了它何时发生。这是某种类型的多线程防止并发线程访问同一流吗?

关于这一点,当两个并发线程同时访问同一个流时,这会导致问题,还是两个线程都有自己的流指针?显然,需要等待,但希望它不会导致未经检查的异常。

【问题讨论】:

    标签: java multithreading stream io


    【解决方案1】:

    在输入流的上下文中,“阻塞”通常是指等待更多可用数据的流。如果您考虑套接字而不是文件,该术语可能更有意义。

    如果您有多个线程同时从同一个流中读取,您必须自己进行同步。没有特定于线程的“流指针”。同样,考虑从同一个套接字(而不是从一个文件)读取多个线程。

    【讨论】:

    • 因此,如果线程 1 开始从流的开头读取数据,然后(之后)线程 2 开始从同一流中读取,那么线程 2 会从头开始读取,还是线程 1 停止读取?
    • @aix 因为流不一定是线程安全的,所以答案是,“你不能肯定地说” :) 我的意思是,如果在线程 1 中读取,你是对的 happens-之前读入线程2。
    【解决方案2】:

    每个都有一个流指针。让两个线程读取同一个流没有多大意义。

    【讨论】:

    • 我明白你在说什么。我想我可能措辞错误,或者我脑子里想出了整件事。有时我连自己都搞糊涂了。
    【解决方案3】:

    “阻塞”是指读取或写入挂起,同时等待更多信息(用于读取)或某些内部缓冲区中的更多空间(用于写入),然后将控制权返回给调用线程。

    而且我很确定流对象负责自己的读/写位置,因此指针只指向流对象,该对象从自己的缓冲区中读取。因此,如果您正在使用同步方法进行阅读,那么每次阅读都会等待轮到它,并获得有凝聚力(但不重叠)的数据。如果方法不同步,那么我很确定一切都会崩溃。

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多