[英]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.