繁体   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