[英]Two threads writing to the same file
我有多個線程(現在就說兩個),每個線程都檢索HTML頁面並將其內容寫入文件。 需要注意的是,每個線程都希望寫入相同的輸出文件。 帶有run()方法的類是靜態內部類。 我想采用的方法是讓每個線程將要寫入的內容放入隊列中。 然后,在線程完成(或所有線程完成)之后,遍歷隊列並將內容打印到文件中。 我不確定如何實現這一點。 同樣,實現可運行接口的類是靜態的。 我並不精通並發,也不一定想做任何花哨的事情。 對簡單實施有什么建議嗎?
您可以使用java.util.concurrent
包中的BlockingQueue
。 您的每個線程都會將其輸出放入隊列中,而第三個線程會將元素從隊列中移出並將它們寫入文件中。 在“阻塞隊列”的API頁面上,有一個示例,您應該可以將其用於實現。 您只需要提供produce
和consume
的實現,就可以完成。
您可以使用單線程的ExecutorService。 這可用於在數據生成時將其寫入(而不是必須等待。
static final ExecutorService logger = Executors.newSingleThreadExecutor();
static void writeToFile(final FileOutputStream fos, final String text) {
logger.execute(new Runnable() {
public void run() {
try {
fos.write(text.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
您也可以使用synchronized
塊。
好吧,根據您的描述,這就是我認為制作人的外觀:
private static final int CAPACITY = 10; // whatever you like here.
private static Object locker = new Object();
private static Queue<String> queue = new ArrayBlockingQueue<String>(CAPACITY);
private static class ThreadTask implements Runnable {
@Override
public void run() {
// retrieve page
// add result to queue
}
}
當然,您可以在執行程序中執行這些ThreadTask,以更好地使用系統資源,並且如果您實現生產者-消費者隊列系統,則您的消費者線程可以與生產者同時運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.