Спроектировать многопоточное приложение

Привет.

Есть задача: дано довольно большое (порядко нескольких сотен тысяч или даже несколько миллионов) сетевых адресов (URL), каждый из которых необходимо получить (метод GET) и, выполнив парсинг, записать результат в файл. Операция должна выполняться в многопоточном режиме (число потоков порядка нескольких сотен, настраивается непосредственно пользователем и подбирается под окружение). Приложение будет выполняться в среде Windows Server на довольно мощном по современным меркам оборудовании. При этом результаты должны попадать в файл без существенной задержки, а не по окончании работы каждого потока.

Вот как я вижу реализацию сего.

Создается фиксированный пул из N потоков, примерно так:

JavaВыделить код

1
2

        int n = 250; //число потоков
        ExecutorService e = Executors.newFixedThreadPool(n);

Затем в очередь под именем c типа ConcurrentLinkedQueue<String> помещаются адреса (например, загружаются из файла) И затем происходит следующее:

JavaВыделить код

1
2
3
4
5
6
7
8
9
10

for (int i = 0;i < n;i++)
            e.execute(new Runnable(){ @Override
                public void run() {
                    String s;
                    while (!c.isEmpty()){
                        s = c.poll();
                        // запрос и обработка ответа.. с помещением результата (куда-то).
                    }
                }
        });

Вопрос в том, насколько такой подход хорош?

Второй вопрос: как организовать запись в файл успешных результатов? Моя идея состоит в организации второй очереди ConcurrentLinkedQueue, в которую из потоков при успешном результате будет заталкиваться результат, а где-то в отдельном потоке (не входящем вообще в этот пул) или даже в главном эта очередь с результатами будет циклично проверяться на пустоту и, если она не пуста, будет извлекаться очередной элемент и записываться в файл.

И еще вопрос, гарантирует ли пул потоков, что, если в очереди будет нужное число элементов и будет хватать ресурсов, он действительно будет выполнять примерно столько потоков, сколько я задал, а не существенно меньше?