2013-06-07 4 views
1

저는 C# SDK의 Java 버전을 생성해야했습니다. 현재. C# System.ServiceProcess.ServiceBase를 확장하는 클래스에서 작업하고 있지만 Java에서 Windows 서비스를 만드는 것이 어려워서 클래스의 다른 메서드 중 일부에 중점을 둡니다.되풀이 타이머 만들기

이 부분의 코드를 분석 한 후

private void StartProcesses() 
    { 
     // create a new cancellationtoken souce 
     _cts = new CancellationTokenSource(); 

     // start the window timer 
     _windowTimer = new Timer(new TimerCallback(WindowCallback), 
      _cts.Token, 0, Convert.ToInt64(this.SQSWindow.TotalMilliseconds)); 

     this.IsWindowing = true; 
    } 

을 다음과 같이 내가 자바에서 복제를 시도하고 현재 C#을 방법은 내가이 WindowCallback 기능마다 SQSWindow을 실행하는이 System.Threading.Timer 개체를 초기화 있다고 생각 보인다 밀리 초.

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html

내가 타이머 기능에 동등을 찾을 수 없기 때문에 내가 자바는 C# 기능을 복제 할 방법이 확실있는 java.util.concurrent의 문서를 읽고 나면. 자바 라이브러리가 제공하는 TimeUnit은 스레드 타임 아웃에만 사용되고 반복 작업은 발생하지 않는 것으로 보입니다.

나는 또한 CancellationTokenSource의 사용에 관해서 궁금합니다. 이 객체가 동작을 계속할 것인가를 결정하기 위해 질의되는 것이면, 왜 그것이 부울과 같은 원시가 아닌가? 추가 기능은 무엇이며 Java 다중 스레딩 모델에도 이와 유사한 구조가 있습니까?

답변

2

ScheduledThreadPoolExecutor 사용하면 아주 비슷한 기능을 얻을 수 있습니다 :

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 
Runnable task = new Runnable() { 
    public void run() { 
     //here the code that needs to run periodically 
    } 
}; 
//run the task every 200 ms from now 
Future<?> future = scheduler.scheduleAtFixedRate(task, 0, 200, TimeUnit.MILLISECONDS); 
//a bit later, you want to cancel the scheduled task: 
future.cancel(true); 
+0

이 포함되어있다 유언 집행자가 그들에 관해 읽은 후에 갈 길인 것처럼 보입니다. – greedybuddha

+0

@greedybuddha 감사합니다! 실제로 [Timer over ScheduledExecutorService]를 선호하는 이유는 거의 없습니다. (http://stackoverflow.com/questions/2213109/java-util-timer-is-it-deprecated) (그 중 하나는 특정 시간에 실행 : 타이머를 사용하면 날짜를 입력 할 수 있지만 SES에서는 기간을 계산해야합니다. – assylias

+0

WindowCallback 메서드는 AmazonSQS 서비스의 메시지를 폴링하고 구문 분석합니다. 따라서 특정 개수 이상의 메시지가 수신되는 경우 파싱을 처리하기 위해 여러 스레드를 생성하는 경우가 있습니다. SingleThreadScheduledExecutor를 사용하는 예제를 사용하거나 자체를 해결할 경우 걱정할 필요가 있습니까? – JME

1

동등한 Java 클래스는 'TimerTimerTask입니다.

예 : 취소 할 수있게하려면

Timer t = new Timer(); 
t.schedule(new TimerTask(){ 

    @Override 
    public void run() { 
     // Do stuff 
    } 

}, startTime, repeatEvery); 

, 다음 변수로 TimerTask를 사용합니다. TimerTask 클래스의 메서드는 cancel입니다.

+1

음을, 그 – fge

+0

@greedybuddha의 ScheduledExecutorService를보다 더 나은 내가 가서 당신을 upvote에거야 자바 5부터 – assylias

관련 문제