我有多个线程(现在让我们说两个),每个线程检索一个HTML页面并将其内容写入文件。需要注意的是,每个线程都想写入相同的输出文件。具有run()方法的类是静态内部类。我想采取的方法是让每个线程将要写入的内容放入队列中。然后,在线程完成(或所有线程完成)之后,迭代队列并将内容打印到文件。我不确定如何实现这一点。同样,实现可运行接口的类是静态的。我并不精通并发,也不一定想做任何花哨的事情。有关简单实现的任何建议吗?
答案 0 :(得分:5)
您可以使用java.util.concurrent
包中的BlockingQueue
。每个线程都会将其输出放入队列,第三个线程会将这些元素从队列中取出并将它们写入文件。在Blocking Queue的API页面上,您应该可以使用它来实现。您只需提供produce
和consume
的实施,即可完成。
答案 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,以便更好地使用系统资源,如果您实现生产者 - 消费者队列系统,您的消费者线程也可以与生产者同时运行。