2014-10-12 4 views
0

Java에서 타이머 방식을 처음 사용하고 다른 언어 (예 : C++)에서 사용했던 다른 타이머 방법과 똑같지 않습니다.타이머는 주 기능의 모든 매개 변수를 사용할 수 없습니다.

다른 여러 스레드에서 백그라운드에서 다른 일이 발생하는 동안 매초마다 호출하는 함수가 필요합니다.

타이머 함수 내에서 참조되는 변수가 final로 정의되어있는 한 main 함수 내부에서 작동하는 것으로 보이는 메서드를 발견했습니다. 한 변수는 최종으로 가질 수 없으므로 타이머 함수 내에서 이것을 참조하는 데 문제가 있습니다.

그럼, 제 질문은 타이머 방식을 사용하는 좋은 방법입니까? 타이머 기능 내에서 사용해야 할 항목이 많다는 것을 명심하십시오. 아니면 다른 변수를 사용하여 슬픔을 느낄 수 있습니까? 해결책은 간단 할 수 있습니다, 사과하는 경우, 긴 하루였습니다. 그리고 마감 할 때마다 제 두뇌가 중단되는 경우가 있습니다. 나는 당신의 문제에 대한 두 가지 솔루션을 볼 수 있습니다

public static void main(String[] args) { 

    Timer timer = new Timer(); 
    String StringThatWillBeChangingOften = ""; 
    final String finalString = "abc"; 

    try{ 

     timer.scheduleAtFixedRate(new TimerTask() { 

      String s = StringThatWillBeChangingOften; //ERROR ON THIS LINE 

      public void run() { 
       //Referencing other variables from main works fine as long they are defined as final 
       //ie finalString works fine 
      } 
     }, 1000, 1000); 

    //Catch... 
    } 
} 
+0

Timer의 run() 메소드가 실행될 때, 타이머를 만들 때 가진'StringThatWillBeChangingOften'의 값을 사용 하시겠습니까, 아니면'StringThatWillBeChangingOften'의 값을 사용하고 싶습니까 지금? –

+0

참조로 통과로 처리 될 수 있습니다. 타이머 내에서 변경되지 않습니다. – DenizC

+0

그건 내 질문에 실제로 대답하지 않습니다. –

답변

0

: 어떤 도움/제안 등

에 대한

덕분에 여기처럼 내 코드는 모습입니다. 먼저 String을 래핑하고 getter와 setter를 제공하는 클래스 StringWrapper을 만듭니다. 따라서 최종으로 선언하고 실행 중에 값을 변경할 수 있습니다.

또 하나의 해결책은 속성으로 (String은 역할에 따라 다르지만 현재 코드에서는 정적 일 수 있음) 선언하는 것입니다. final 키워드는 그렇지 않습니다. 더 이상 필요 없다.

편집 : JB Nizet이 관찰

,이 변수는 다수의 스레드가 동시에 사용되는 경우, 동기화가 필요한 점에 유의. 첫 번째 경우 getter/setter 코드에서이 작업을 수행합니다. 두 번째 경우에는 직접 특성에 액세스하지 말고 스레드 안전 getter 및 setter를 구현해야합니다.

+0

두 경우 모두 한 필드가 다른 필드를 읽는 동안 하나의 스레드가 값을 변경하기 때문에 필드에 액세스하려면 동기화가 필요합니다. –

+0

확실히,하지만 그것은 별개의 질문입니다, 그렇지 않습니까? – Dici

+1

정렬 방법. 그러나 언급 할 가치가있는 것은 IMO입니다. –

관련 문제