簡體   English   中英

兩個線程寫入同一個文件

[英]Two threads writing to the same file

我有多個線程(現在就說兩個),每個線程都檢索HTML頁面並將其內容寫入文件。 需要注意的是,每個線程都希望寫入相同的輸出文件。 帶有run()方法的類是靜態內部類。 我想采用的方法是讓每個線程將要寫入的內容放入隊列中。 然后,在線程完成(或所有線程完成)之后,遍歷隊列並將內容打印到文件中。 我不確定如何實現這一點。 同樣,實現可運行接口的類是靜態的。 我並不精通並發,也不一定想做任何花哨的事情。 對簡單實施有什么建議嗎?

您可以使用java.util.concurrent包中的BlockingQueue 您的每個線程都會將其輸出放入隊列中,而第三個線程會將元素從隊列中移出並將它們寫入文件中。 在“阻塞隊列”的API頁面上,有一個示例,您應該可以將其用於實現。 您只需要提供produceconsume的實現,就可以完成。

您可以使用單線程的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM