我创建了一个可处理 FLV 文件的 Web 应用程序。
该应用程序使用我创建的一个库来解析 flv 文件的内容。该库使用 FileChannel 来查找文件。
现在,我从不同的线程中寻找相同的 flv 文件,因此遇到了一种奇怪的行为。这么说吧Thread_1 and Thread_2都在寻求电影.flv同时(我的问题出现在示例之后)。
Thread_1
// Thread_1 moves to position 200 to read something
FileChannel chan1 = new FileInputStream("movie.flv").getFileChannel();
chan1.position(200);
Thread_2(紧接着执行Thread_1)
// Thread_2 moves to position 600 to read something else
FileChannel chan2 = new FileInputStream("movie.flv").getFileChannel();
chan2.position(600);
Finally Thread_1 does:
ByteBuffer bb = ByteBuffer.allocate(40);
chan1.read(bb);
Is Thread_1从位置 200 还是从位置 600 读取 40 个字节?
更准确地说,是chan1 and chan2是否独立(=可以独立寻找)渠道?
来自文档 http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#getChannel%28%29我读到 FileChannel 是unique,所以我的赌注(不幸的是)是在这个例子中Thread_1将从位置 600 开始读取:\
如果有的话,您能建议一种不同的方法来独立于不同的线程查找文件吗?
thanks!
我编写了一个库,它支持在不同线程或不同进程中对同一文件进行写入和读取。它工作得很好(假设流仅由一个线程使用)
您可能会发现文件的内存映射是共享数据的一种更简单的方法,因为整个文件理论上都在内存中。您可以创建多个.splice()
MappedByteBuffer 以在不同位置同时访问它(每个线程一个)。它还比系统调用快 10 倍。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)