2011-11-06 92 views
2

似乎无法找到关于输入流“阻塞”的任何内容,它描述了它是什么以及它何时发生。这是多线程防止并发线程访问同一个流的类型吗?Java输入流“阻塞”和多线程

在这一点上,当两个并发线程同时访问同一个流时,这是否会导致问题,或者两个线程都获得它们自己的流指针?显然,人们需要等待,但希望这不会导致一个不受检查的例外。

回答

2

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

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

+0

因此,如果线程1开始从流的开始读取数据,然后(之后)线程2开始从同一个流中读取数据,线程2是否从头开始读取,或者线程1是从哪里断开的? –

+0

@ user1030796:后者(线程1停止工作)。 – NPE

+1

@aix因为流不一定是线程安全的,答案是,“你不能肯定地说”:)我的意思是,你是正确的如果在线程中读取1 *发生之前*在线程2中读取。 – alf

1

每个有一个流指针。让两个线程读取同一个流并没有什么意义。

+0

I看看你在说什么。我想我可能会说错了,或者在我脑子里想出了所有错误的东西。有时我甚至会迷惑自己。 –

4

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

而且我非常确定流对象是否负责自己的读/写位置,所以指针只是指向从它自己的缓冲区读出的流对象。因此,如果您使用同步方法进行阅读,那么每次阅读都会等待,并获得内聚(但不重叠)的数据。如果方法不同步,那么我很确定所有的地狱都会崩溃。