Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个线程应该从同一个DataInputStream读取数据吗?_Java_Multithreading - Fatal编程技术网

Java 多个线程应该从同一个DataInputStream读取数据吗?

Java 多个线程应该从同一个DataInputStream读取数据吗?,java,multithreading,Java,Multithreading,我希望我的程序获得一个文件,然后根据其字节内容创建4个文件 仅使用主线程,我只创建一个DataInputStream,并按顺序执行我的操作 现在,我对使我的程序并发感兴趣。也许我可以有四个线程——每个要创建的文件一个线程 我不想一次将文件的字节全部读入内存,因此我的线程需要不断查询DataInputStream,以使用read()对字节进行流式处理 我不清楚的是,我的4个线程是应该在同一个DataInputStream上调用read(),还是应该每个线程都有自己的独立流来读取?我认为这不是一个好

我希望我的程序获得一个文件,然后根据其字节内容创建4个文件

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

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

我不想一次将文件的字节全部读入内存,因此我的线程需要不断查询
DataInputStream
,以使用
read()
对字节进行流式处理


我不清楚的是,我的4个线程是应该在同一个
DataInputStream
上调用
read()
,还是应该每个线程都有自己的独立流来读取?

我认为这不是一个好主意。看

对于多线程访问,DataInputStream不一定是安全的。线程安全是可选的,由此类中方法的用户负责


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


例如,您可能希望从DataInputStream中读入一个数据块,并缓存该小数据块。当所有4个线程都读取了区块后,您可以处理它并继续读取。您永远不必将整个文件加载到内存中。您只需加载少量数据。

假设您希望四个新文件中的每个文件都包含所有数据,则每个线程应创建自己的DataInputStream


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

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

所以在您的例子中,您应该初始化四个不同的FileInputStream,生成四个DataInputStream,分别用于四个线程。读取操作不会受到干扰。

简短回答是否

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


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

是否要从4个单独的文件中读取数据?如果要从单个文件中读取数据,为什么要使用多线程?同样,DataInputStream不是线程安全的。可能不是。输入文件不是多线程的。磁盘不是多线程的。并发在这里是没有意义的。@EJP:啊,如果四个线程只创建文件,那么使用四个线程就没有什么区别了?此外,我将使用四个进程,或者即使您不需要四个线程相互了解工作情况……是的,在这里最昂贵的操作是读取文件。因此,如果单个线程执行读取操作,则同一线程可以轻松地执行新文件创建任务。同样,在这种情况下,您不能部署多线程。