2010-12-30 5 views
3

나는 프로그램을 작성하고 있는데, 사용자가 1 초마다 특정 메소드 호출을 할 수 있기를 바랍니다. Java에서이 작업을 수행하는 가장 좋은 방법을 찾는 데 문제가 있습니다.메소드 호출을 Java로 초당 1 초로 제한 하시겠습니까?

제가 생각할 수있는 가장 좋은 아이디어는 제한하고 싶고 마지막 호출이 있었을 때의 일종의 정적 변수 (어디에 저장되어 있습니까?)가 필요하고 필요에 따라 잠자기하고 싶은 메소드 호출을위한 pointcut을 갖는 것입니다. 이 좋은 습관인가?

감사합니다.

편집 : 메서드 호출이 바쁜 웹 서버를 치기 때문에 초당 1 개로 제한해야합니다.

편집 2 : 서버에 액세스하기 위해 클라이언트를 쓰고 있습니다. 서버를 제어 할 권한이 없습니다.

+3

잠깐, 와트? 이것이 좋은 생각이라고 생각하는 이유는 무엇입니까? – delnan

+1

죄송합니다, 아마도 내가 잘못 진술했습니다. 정확히 API는 아닙니다. 메소드 호출은 1 초마다 하나의 요청 만 수행 할 수 있다는 제한이있는 사용량이 많은 서버에 요청을 작성합니다. EDIT를 참조하십시오. – awegawef

+4

글쎄, 가치있는 것을 위해, "바쁜 웹 서버"는 * 소비자 *가 조절을 기대한다면 제대로 설계되지 않았습니다. –

답변

2

왜 이렇게할까요? 나는이 기발한 무언가 솔루션의 일종을 제공해야한다면, 나는 당신이 메서드가 호출 된 마지막 시간을 추적 할

System.currentTimeMillis() 

를 사용 말하고 싶지만, 한 두 번째는 지금부터 경과하지 않은 경우 단순히 반환 마지막으로 메서드가 호출 될 때까지

4

"새로 고침"과 같은 시나리오에서 자주 사용되는데, 빈도를 제한하는 것이 좋습니다.

별도의 작업자 스레드를 사용합니다. 메소드 호출은 스레드에 신호를 보내 즉시 반환합니다. 트레드는 깨어 나고, 마지막 실행 후 얼마나 오랫동안 있었는지 확인하고 필요한 경우 실행합니다. 마지막 실행을 추적하는 긴 필드는 스레드의 멤버 변수가 될 수 있습니다.

+0

실제로 이것은 매우 일반적이며 이벤트 필터링의 한 종류입니다. 이러한 기술은 비디오 게임에서 매우 일반적입니다 (예를 들어, Age of Empire * 시리즈에 이벤트 필터링을 적용하여 엄청난 성능 향상을 얻는 방법에 대한 기사는 Gamasutra의 훌륭한 기사를 참조하십시오). 기본적으로 이벤트를 가로 채고 (예 : 모든 "마우스 끌기"이벤트) 프로그램에서 허용/필요로하는대로 다시 캐스팅합니다 (예 : 마우스를 30 초 동안 계속 드래그 한 경우에도 10 "마우스 끌기"이벤트 만 다시 캐스팅 할 수 있음).). – SyntaxT3rr0r

+0

답변 해 주셔서 감사합니다. 제 질문은 메서드를 제한하는 코드를 구조화하는 방법, 즉 특정 메서드 호출을위한 pointcut을 만드는 방법에 더 중점을 두었습니다. 이것이 좋은 접근이라고 생각하십니까? – awegawef

+0

확인. 나는 당신이 AOP 특정 질문을 요구하는 것을 본다. 대답 할 수 없다, 나는 두렵다. AOP 사용자가 아닙니다. –

0

사용자가이 메서드를 호출하기 위해 단추를 눌러야한다고 가정합니다. 사용자가 다시 클릭 할 수있을 때까지 버튼을 비활성화합니다.

0

왜 이렇게하고 싶은지 잘 모르겠습니다. 메모리 또는 CPU를 절약하려고합니까? 여러 스레드가있는 웹 응용 프로그램이 있다고 가정하면 세마포어의 수로 코드를 실행할 수있는 카운트 세마포어 인 java.util.concurrent.Semaphore와 같은 것을 사용할 수 있습니다. http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html

또한 java.util.concurrent의 일부인 스레드 풀링 스케줄러를 사용하여 스레드 풀에 특정 수의 스레드를 생성 한 다음 특정 코드가 실행되는 빈도를 제한 할 수있는 방식으로 작업을 할당 할 수 있습니다.

당신이 우리에게 응용 프로그램의 컨텍스트에 대한 자세한 내용을 말한다면 우리는 더 나은 당신을 도울 수있는 등 BlockingQueue를

으로 도움이 될 수있는 java.util.concurrent의 다른 데이터 구조가 있습니다.

1

명령 대기열을 사용하고 그런 다음 고정 속도 스케줄러를 사용하여 필요한 속도로 명령을 보내면됩니다. 큐에 들어가는 새 명령이 기존의 디스패치되지 않은 명령과 병합 될 수 있는지 여부를 감지하기 위해 논리를 구축 할 수도 있습니다. 봐 java.util.concurrent.ScheduledExecutorcommand pattern

관련 문제