2014-01-22 3 views
1

Я новичок в потоковом режиме, поэтому я хочу понять, что происходит за кулисами, когда вы создаете связку Thread s в цикле и последствия/лучшие способы сделать это.Создание потоков в цикле

Вот пример:

for (Page page : book) { 
    Thread t = new Thread(new Runnable() { 
     public void run() { 
      //http request to get page and put into concurrent data structure 
     } 
    }); 
    t.start(); 
    threads.add(t); 
} 
//wait for threads 

Как вы можете видеть, в моем конкретном случае использования прямо сейчас, я листал объекты, которые я заказываю через HTTP. Я знаю, что здесь не обязательно быть потоками, и вместо этого я мог бы делать асинхронные запросы, но как (с объяснениями), как это можно улучшить.

ответ

3

В вашем примере вы создаете и начинаете новую тему для каждого объекта Page, который у вас есть в вашей книге. Это не полезно, если в вашей системе имеется больше страниц, чем ядер.

Это также довольно низкоуровневый к настоящему времени, чтобы напрямую создавать и начинать темы и отслеживать их.

Лучшим решением было бы использовать ExecutorService и создать ряд потоков, близких, например, к числу ядер, находящихся в системе (для задач, связанных с I/O, вы можете создать больше потоков, чем это : вы можете проверить комментарии ниже этого ответа).

Например:

final ExecutorService e = 
    Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 

for (Page page : book) { 
    e.submit(new Runnable() { 
       //http request to get page and put into concurrent data structure} 
} 

Вы бы затем ждать вашего ExecutorService прекратить свою работу.

Обратите внимание, что в зависимости от сервера, из которого вы извлекаете информацию, вам может потребоваться добавить с целями задержки, чтобы не «слишком сильно забивать» сервер.

Некоторые веб-сайты расскажут вам, как часто вы можете их запрашивать (например, биткойн-бит Bitstamp допускает один запрос в секунду) и запретит ваш IP-адрес, если вы не соблюдаете задержку. Другие вас не устраивают и просто запрещают ваш IP-адрес, если обнаруживают, что вы слишком быстро набираете.

+0

это именно тот совет, который я искал. большое спасибо! – tau

+1

«Это не будет эффективным, если в вашей системе будет больше страниц, чем ядер». - вы знаете, что потоки, вероятно, будут связаны с сетью и заблокированы большую часть времени? –

+0

да, но я хотел понять, как лучше использовать потоки (как я сказал в своем сообщении, я бы скорее решил эту конкретную проблему с асинхронными запросами, но это заставило меня задуматься о том, как более эффективно управлять потоками в java). – tau

Смежные вопросы