Thread로 삽질을 하다가.....
알게 된....

우선 httpClient를 이용해서 웹스크래핑을 하는데요. Thread를 이용해서 5개정도 만들어서 5개를 스크래핑 시키면 더 빠르더라구요-_-; 그래서 Thread로 삽질을 하게 되었는데!

10분마다 도는 스케쥴러에 의해 실행되는 스케쥴러가 있다고 칩시다. 이 스케쥴러는 10분마다 해당 일을 실행합니다. 그 해당일은 스레드5개를 만들어서 5개를 웹스크래핑하는 겁니다.
이걸 그냥
[code]MyThread thread = new Thread();
thread.start();[/code]
이렇게 5개를 반복해서 넣어버리면......5개가 돌고 있는데 아직 끝나지 않았는데 이 스케쥴러는 다시 또 5개의 스레드를 만들어서 또 실행을 하게 됩니다-_-;
즉, 해당 메소드에서 해당 스레드가 끝날 때 까지 기다려주는 메소드인 것입니다.

[code]logger.info("DailySearch Start!");
        List<ScrapThread> threadList = new ArrayList<ScrapThread>();
       
        int count = bizNoDao.countBizListByStatus("T");
        for (int i=0; i<count / THREAD_SIZE; i++)
        {
            ScrapThread scrapThread = (ScrapThread)
                applicationContext.getBean("scrapThread");
            List<User> list = bizNoDao.selectUserBytStatusAndRow(
                    i * THREAD_SIZE, i * THREAD_SIZE + THREAD_SIZE, "T");
           
            scrapThread.setList(list);
            scrapThread.start();
           
            threadList.add(scrapThread);
        }
       
        for (int i=0; i<threadList.size(); i++)
        {
            try
            {
                threadList.get(i).join();
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        logger.info("DailySearch End!");
[/code]
조낸 귀찮아서 그냥 소스 가져다 붙입니다-_-;
그냥 내용을 보면 ScrapThread라는 놈을 여러개 만들어서 Thrad start시켜놓고, 여러개가 돌게 한다음에 고 아래에서는 해당 스레드를 join을 시킵니다. 그럼 1번스레드가 끝날 때까지 웨이트 하다가 끝나면 다시 2번쓰레드를 join시키고, 그런식으로 다 끝날 때 까지 기다린 다음에 끝내야합니다.

그렇게 되면 이 해당 메소드가 끝나지 않았기 때문에 다 끝나고 난 다음에 DailySearch End라는 말이 호출이 되게 되는 겁니다-_-; join안하면 바로 DailySearch End찍고, 그냥 스케쥴러가 끝이 나는거죠.

이것도 장황하게 포스팅하는 이유는 반나절을 고생해서 입니다-_-;

 
Posted by 머드초보
,