Java實現多執行緒寫資料到檔案【佇列-檔案】
阿新 • • 發佈:2019-01-24
大致流程
先將要寫入檔案的資料寫入到一個佇列中,然後單開一個執行緒專門讀取佇列資料寫入檔案,可以保證寫入到檔案的資料的順序,
生產者類即多執行緒寫入檔案模擬
package com.ldl.test.domain; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ConcurrentLinkedQueue; /** * 將資料儲存到佇列中(生產者) * @author liam * */ public class SaveDataToQueue implements Runnable{ private ConcurrentLinkedQueue<String> queue; private String data; public SaveDataToQueue(ConcurrentLinkedQueue<String> queue, String data) { this.queue = queue; this.data = data; } @Override public void run() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:hh:ss sss"); data = sdf.format(new Date())+":"+data; System.out.println(data); queue.add(data); } }
消費者類(將佇列資料寫入檔案)
package com.ldl.test.domain; import java.io.BufferedWriter; import java.io.IOException; import java.util.concurrent.ConcurrentLinkedQueue; /** * 將佇列中的資料寫進檔案中(消費者) * @author liam * */ public class PutDataToFile implements Runnable { private ConcurrentLinkedQueue<String> queue; private BufferedWriter buff; public PutDataToFile(ConcurrentLinkedQueue<String> queue, BufferedWriter buff) { super(); this.queue = queue; this.buff = buff; } @Override public void run() { while(true){ if(!queue.isEmpty()){ try { buff.write(queue.poll()); buff.newLine(); buff.flush(); } catch (IOException e) { e.printStackTrace(); } } } } }
測試類
package com.ldl.test.controller; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.concurrent.ConcurrentLinkedQueue; import com.ldl.test.domain.PutDataToFile; import com.ldl.test.domain.SaveDataToQueue; /** * * @author liam * */ public class WriteFileFromQueue { public static void main(String[] args) { //獲取當前類所在的包 /*File fileB = new File(WriteFileFromQueue.class.getResource("").getPath()); System.out.println("fileB path: " + fileB); */ //獲取當前類所在的工程名 // System.out.println(System.getProperty("user.dir")); FileWriter fw= null; BufferedWriter bufw= null; try { File file = new File(System.getProperty("user.dir")+File.separator+"upload"+File.separator+"liam.txt"); if(!file.exists()){ //file.mkdirs(); file.createNewFile(); } fw=new FileWriter(file,true); bufw=new BufferedWriter(fw); } catch (IOException e) { e.printStackTrace(); } ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>(); for(int i = 0; i < 10; i++){ new Thread(new SaveDataToQueue(queue, "寫入資料為: "+i)).start(); } new Thread(new PutDataToFile(queue, bufw)).start();; } }
測試結果
以上內容,僅作為記錄本次練習使用