两个线程写入同一个文件

时间:2011-11-19 09:30:46

标签: java multithreading concurrency

我有多个线程(现在让我们说两个),每个线程检索一个HTML页面并将其内容写入文件。需要注意的是,每个线程都想写入相同的输出文件。具有run()方法的类是静态内部类。我想采取的方法是让每个线程将要写入的内容放入队列中。然后,在线程完成(或所有线程完成)之后,迭代队列并将内容打印到文件。我不确定如何实现这一点。同样,实现可运行接口的类是静态的。我并不精通并发,也不一定想做任何花哨的事情。有关简单实现的任何建议吗?

4 个答案:

答案 0 :(得分:5)

您可以使用java.util.concurrent包中的BlockingQueue。每个线程都会将其输出放入队列,第三个线程会将这些元素从队列中取出并将它们写入文件。在Blocking Queue的API页面上,您应该可以使用它来实现。您只需提供produceconsume的实施,即可完成。

答案 1 :(得分:3)

您可以使用单线程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();
            }
        }
    });
}

答案 2 :(得分:0)

您也可以使用synchronized块。

答案 3 :(得分:0)

嗯,根据您的描述,我认为您的制作人应该如此看待:

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
    }       
}

当然,您可以在Executor中执行这些ThreadTasks,以便更好地使用系统资源,如果您实现生产者 - 消费者队列系统,您的消费者线程也可以与生产者同时运行。