java多線程有序讀取同一個(gè)文件
本人剛參加工作,面試的時(shí)候遇四道筆試題,其中就有這道多線程有序讀取文件的題目,初看時(shí)拿不準(zhǔn),感覺(jué)會(huì),又感覺(jué)不會(huì)。于是放棄了這道題,今天閑下來(lái)好好做一遍。
//定義一個(gè)runnable接口的實(shí)現(xiàn)類(lèi)
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RunnableImpl implements Runnable{
//定義文件讀取的游標(biāo)位置
private static int now=0;
//定義即將被讀取的文件
static File file=new File("source/error.log");
//使用io包中的RandomAccessFile類(lèi),支持文件的隨機(jī)訪問(wèn)
static RandomAccessFile raf=null;
//定義每次讀取的字節(jié)數(shù)
final static int len=256;
RunnableImpl() throws IOException{
raf=new RandomAccessFile(file, "rw");
}
@Override
public void run() {
while(true){
try {
//synchronized實(shí)現(xiàn)多線程的同步
synchronized (raf) {
//將文件內(nèi)容讀取到b字節(jié)數(shù)組中
byte[] b = new byte[len];
//設(shè)置游標(biāo)位置
raf.seek(now);
int temp=raf.read(b);
//如果沒(méi)讀取到,就結(jié)束線程
if(temp==-1){
return ;
}
//設(shè)置游標(biāo)偏移量
now+=temp;
//打印文件內(nèi)容
System.out.println(new String(b));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
運(yùn)行程序,我使用了3個(gè)線程
public static void main(String[] args) throws IOException {
RunnableImpl run=new RunnableImpl();
new Thread(run).start();
new Thread(run).start();
new Thread(run).start();
}
文件內(nèi)容截圖

輸出結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
OutOfMemoryError內(nèi)存不足和StackOverflowError堆棧溢出示例詳解
這篇文章主要為大家介紹了OutOfMemoryError內(nèi)存不足和StackOverflowError堆棧溢出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
使用jmeter實(shí)現(xiàn)對(duì)jar包的調(diào)用方式
這篇文章主要介紹了使用jmeter實(shí)現(xiàn)對(duì)jar包的調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)示例分享
泛型是Java SE5.0的重要特性,使用泛型編程可以使代碼獲得最大的重用。由于在使用泛型時(shí)要指明泛型的具體類(lèi)型,這樣就避免了類(lèi)型轉(zhuǎn)換。本實(shí)例將使用泛型來(lái)實(shí)現(xiàn)一個(gè)棧結(jié)構(gòu),并對(duì)其進(jìn)行測(cè)試2014-03-03
Spring MVC學(xué)習(xí)教程之視圖深入解析
這篇文章主要給大家介紹了關(guān)于Spring MVC學(xué)習(xí)教程之視圖解析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用spring mvc具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-11-11
webservice實(shí)現(xiàn)springboot項(xiàng)目間接口調(diào)用與對(duì)象傳遞示例
本文主要介紹了webservice實(shí)現(xiàn)springboot項(xiàng)目間接口調(diào)用與對(duì)象傳遞示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

