2012-03-02 2 views
0

나는 간단한 크롤러의 역할을하는 클래스가 있으며 서블릿 내에서이 클래스를 호출하려고한다.자바 서블릿에서 클래스 (실행/중지)를 제어하는 ​​방법

내 아이디어는 사용자로부터 url을 얻는 것이고 url 요청은 서블릿에 전달되고 servelt는 URL을 클래스에 전달하고 클래스는 크롤링을 시작합니다. 내 서블릿이이 클래스의 한 인스턴스 만 생성하도록합니다. crawlwer에서 검색된 데이터는 클래스에 의해 DB에 직접 추가됩니다. 나는 내가 서블릿과 클래스와 서블릿이 상태 코드를 변경하는 경우 클래스간에 공유하는 간단한 XML 파일을 만들 수라고 생각이 문제에 대한 (서블릿 에서 정지/실행/정지와 같은 클래스의 동작을 제어 할 상태 변경에 대한 응답이어야 함)

하지만 실행/중단/중지 명령과 같은 클래스의 동작을 제어하는 ​​방법에 대한 몇 가지 의구심이 있습니다. 클래스가 다중 스레드가 아니기 때문에 어떤 생각이 들지 않습니다. 서블릿에서 클래스를 호출 한 후에 클래스를 호출 할 것이고이 클래스는 네트워크에서 읽을 필요가 있기 때문에이를 실행하는 동안 약간의 갭/얼어 붙는 단계가있을 것입니다.

어떻게이 상황에서 동시성의 문제를 해결할 수 있습니까? 또는 다른 단어에 나는 어떤 동시성 문제가 있거나하지 않습니다?

안부.

답변

2

사용중인 서블릿 컨테이너에 따라 다릅니다. 일부 컨테이너는 사용자 요청 당 새 스레드를 생성합니다 (거의 항상 이것이 바람직한 동작입니다). 따라서 동시성을 확실히 설계해야합니다.

서블릿 클래스가 SingleThreadModel을 구현하도록 만들면 서비스 메소드에서 크롤러 클래스 코드를 직접 호출 할 수 있습니다. 이때 스레드는 service을 한 번에 입력합니다.

이것은 당신이 init 메소드에서 단독 실행 프로그램 서비스에서 SingleThreadModel을 구현하고 생성하지 않기 때문에 대신에 그, 원하는 것을 아마도 아닌 주어진 시간에 처리 할 수 ​​있습니다 만 URL, 의미 :

ExecutorService ex = Executors.newFixedThreadPool(20); //Only 20 tasks at a given time 

는 다음, service 방법의 요청에 지정된 URL로 새로운 CrawlingTask (Runnable을)를 생성 한 후 집행에 작업을 제출합니다.

그런 식으로 당신은 또한 수 종료가 :

ex.shutdown(); 

ExecutorService를 스레드로부터 안전합니다, 당신은 작업을 대기열에 때 동시성에 대해 걱정할 필요가 없습니다.

-1

먼저 클래스스레드의 차이점을 이해하십시오. 클래스는 코드 일 뿐이며 스레드는 코드가 이고 실행 코드가 인 스레드입니다. 당신은 클래스를 멈추거나 멈추지 않고 클래스의 코드를 실행하는 쓰레드를 멈추거나 멈춘다.

나는 당신이 무엇을 묘사하는 멀티 스레딩 및 스레드 동기화에 대한 매우 때문에 Java concurrency programming.에 최대 읽기 시작하는 것이 좋습니다 것입니다.

관련 문제