2014-01-22 3 views
1

나는 스레딩을 처음 사용하므로 회 돌이에 Thread 묶음을 만들고 그 의미를 더 잘 이해하기 위해 장면 뒤에서 어떤 일이 일어나는지 이해하고 싶습니다. 아마 당신은 볼 수 있듯이루프에서 스레드 만들기

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 bitcoin exchange는 초당 하나의 검색어를 허용), 지연을 존중하지 않으면 IP를 금지합니다. 다른 사람들은 당신에게 아무 것도 안하고 당신이 너무 빨리 뛰고 있음을 감지하면 단순히 당신의 지적 재산권을 금지합니다.

+0

이것은 정확히 제가 찾던 조언입니다. 고마워요! – tau

+1

'시스템에 코어보다 많은 페이지가 있으면 효율적이지 않습니다.' - 당신은 쓰레드가 아마도 네트워크에 묶여 있고 대부분의 시간을 차단하고 있다는 것을 알고 있습니까? –

+0

네,하지만 스레드를 더 잘 사용하는 방법을 알고 싶었습니다. (내 게시물에서 말했듯이 비동기 요청으로이 특정 문제를 해결할 것이지만 Java에서 스레드를보다 효과적으로 관리하는 방법에 대해 생각하고 있습니다.) – tau