多个线程应该从同一个DataInputStream中读取吗?

时间:2014-03-12 02:26:03

标签: java multithreading

我喜欢我的程序来获取文件,然后根据其字节内容创建4个文件。

仅使用主线程,我只创建一个DataInputStream并按顺序执行我的操作。

现在,我有兴趣让我的程序并发。也许我可以有四个线程 - 每个文件要创建一个。

我不想一次性将文件的字节读入内存,因此我的线程需要不断查询DataInputStream以使用read()来传输字节。

我不清楚的是,如果我的4个帖子在read()上调用DataInputStream,或者每个帖子是否都有自己独立的流来读取?

5 个答案:

答案 0 :(得分:2)

我不认为这是个好主意。见http://download.java.net/jdk7/archive/b123/docs/api/java/io/DataInputStream.html

  

DataInputStream对于多线程访问不一定安全。线程安全是可选的,是本课程方法用户的责任。

答案 1 :(得分:1)

假设您需要四个新文件中的每个文件中的所有数据,则每个线程都应创建自己的DataInputStream。

如果线程共享一个DataInputStream,那么每个线程最多只能获得一些随机数据。在最坏的情况下,由于对非线程安全的代码进行多线程访问,您将导致崩溃或数据损坏。

答案 2 :(得分:0)

如果要将1个文件中的数据读入4个单独的文件,则不会共享DataInputStream。但是,您可以包装该流并添加使其成为线程安全的功能。

例如,您可能希望从DataInputStream中读取一大块数据并缓存该小块。当所有4个线程都已读取块时,您可以将其丢弃并继续读取。您永远不必将完整的文件加载到内存中。你只需加载少量。

答案 3 :(得分:0)

如果你看一下DataInputStream的文档。它是一个FilterInputStream,这意味着将读操作委托给其他inputStream。假设你在这里使用的是FileInputStream,在大多数平台上,将支持并发读取。

所以在你的情况下,你应该初始化四个不同的FileInputStream,得到四个DataInputStream,分别在四个线程中使用。读操作不会受到干扰。

答案 4 :(得分:0)

简短的回答是否定的。

更长的答案:让一个线程读取DataInputStream,并将数据放入四个队列中的一个,每个输出文件一个。根据字节内容确定哪个队列。

有四个线程,每个线程从队列中读取,写入输出文件。