File data = new File("data.txt")
try {
InputStreamReader read = new InputStreamReader(new FileInputStream(
data), "UTF-8")
final BufferedReader bufferedReader = new BufferedReader(read)
for (int i = 0i <5i++) {
new Thread(new Runnable() {
@Override
public void run() {
String lineTXT = null
synchronized (bufferedReader) {
try {
while ((lineTXT = bufferedReader.readLine()) != null) {
System.out.println(Thread.currentThread()+":"+lineTXT)
bufferedReader.notify()
bufferedReader.wait()
}
} catch (IOException e) {
e.printStackTrace()
} catch (InterruptedException e) {
e.printStackTrace()
}finally{
bufferedReader.notifyAll()
}
}
}
}).start()
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace()
} catch (FileNotFoundException e) {
e.printStackTrace()
}
}
多线程读取文件在一块硬盘上没用,瓶颈在硬盘I/O,而不在CPU和内存。读取文件时,CPU不用复杂的计算工作,只是数据传输而已,多线程反而造成磁头来回移动,效率不高。如果是两块以上的硬盘,可以用不同的线程访问不同的硬盘,效率比单线程要高而且多线程 *** 作同一文件除了效率还会有多线程问题,多个线程同时往数组里存数据还会有线程安全问题,如果不同步处理读取的文件就是错误的。
如果读取的话只能设置每个线程各自读取偏 移量
读取文件大小(比如大小是200K)。 2,启动5个线程,第一个线程读到40,第二个线程跳过40在读到80,总之得合理安排好各个线程读取的大小。这样才能不重复读取。大数据处理框架mapreduce原理和此类似
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)