2012-12-24 32 views
0

我实现了一个下载管理器,除了我注意到一件事情之外,它可以正常工作,有时线程在写入文件时会阻塞一段时间(50毫秒到10秒),我正在运行该程序在Android上(基于Linux),我的猜测是,如果某种缓冲区在操作系统级别需要刷新,而我的写入实际上是写入该缓冲区,并且如果该缓冲区已满,写入需要等待。有时写入文件块

我的问题是什么可能导致阻塞的原因?

+0

java.io.BufferedWriter也可以在Android上工作吗? “ – ignis

+2

”......可能导致阻塞的可能原因是什么?“ - 没有看到你的代码,这是不可能告诉的。 – Squonk

+1

写入闪存是一种有时会遇到延迟的操作。 Android是一个突破性的系统,但许多实现在Flash接口的实现细节中存在“一次一个”的瓶颈,所以在某些情况下可能会看到糟糕的性能。这10秒显然令人惊讶,让人想知道手机上还有什么可以运行。 –

回答

3

IO是众所周知的是一个“堵”的活动,因此,你的问题应该是“您应该做些什么,而你的程序正忙等待IO完成”

采用一些众所周知的并发策略和基于事件的编程模式是一个好开始

+0

这个答案很有意义,谢谢。 – neevek

+0

我发现问题的原因已经很久了,我在这里留言以防其他人可能会觉得这很有帮助。这确实是因为**繁忙的IO **。我正在使用多线程来下载文件,如果目标文件太大,需要在线程开始写入文件之前创建一个大的稀疏文件(使用seek),所以'write'部分块,我试着保留所有文件线程写入文件的开头,以避免首先创建一个如此之大的文件,通过这样做,我需要一个配置文件来保持偏移量和每个线程写入的字节数。现在一切正常。 – neevek

0

-我已经完成了以下面的方式编写和读取文件,并且从未遇到任何probs。

如:

File f = new File("Path"); 
FileWriter fw = new FileWriter(f); 
BufferedWriter bw = new BufferedWriter(fw); 

-您也可以尝试一下NIO包在Java中。