2011-11-03 9 views
2

코드를 훨씬 더 자세한 버전으로 변경하여 더 나은 아이디어를 얻을 수 있습니다.효율적으로 int 값을 모니터하십시오.

정수 값을 "감시"하고 변경 될 때 즉시 응답해야합니다. 지금까지 내가 찾은 가장 좋은 방법은 스레드를 무한 루프에서 사용하는 것입니다.

다음은 내 프로젝트에서 매우 단순화 된 부분입니다. 요약하면 notificationValue는 My Bubble 클래스 내의 버튼 클릭으로 1로 설정됩니다. 이 notificationValue를 모니터하고 변경 될 때마다 응답 할 수 있으려면 애플릿이 필요합니다. 여기

public class MyApplet extends JApplet 
{ 
    Bubble myBubble = new Bubble(); 
    public void run() 
    { 
     new Thread(
     new Runnable() { 
      public void run() { 
       while(true) { 
        if(myBubble.getNotificationValue() == 1) { 
         /* here I would respond to when the 
         notification is of type 1 */ 
         myBubble.resetNotificationValue; 
        } 
        else if(myBubble.getNotificationValue() == 2) { 
         /* here I would respond to when the 
         notification is of type 2 */ 
         myBubble.resetNotificationValue; 
        } 
        else if(myBubble.getNotificationValue() != 2) { 
         /* if it is any other number other 
         than 0 */ 
         myBubble.resetNotificationValue; 
        } 

        // don't do anything if it is 0 
       } 
      } 
     }).start(); 
    } 
} 

그리고 내 클래스 :

public class Bubble extends JPanel 
{ 
    public JButton bubbleButton; 

    public int notificationValue = 0; 

    public int getNotificationValue() 
    { 
     return notificationValue; 
    } 
    public void resetNotificationValue() 
    { 
     notificationValue = 0; 
    } 

    protected void bubbleButtonClicked(int buttonIndex) 
    { 
     notificationValue = buttonIndex; 
    } 

    public Bubble() 
    { 
     bubbleButton = new JButton(); 
     bubbleButton.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent event) 
      { 
       bubbleButtonClicked(1); 
      } 
     }); 
    } 
} 

는하지만 분명히 그 100 %의 CPU를 유지하고 전혀 효율적이지

여기 내 애플릿입니다. 이것을하는 더 좋은 방법은 무엇입니까? (정수를 변경하는 메소드를 변경할 수 없다고 가정하십시오.)

+1

일반적으로 변경 사항을 알리기 위해 펄스가있는 잠금 장치를 사용하므로 스레드 대기 상태가 유지되지만 개체를 ​​잠그고 설정기를 수정할 수 있어야합니다. 그러나 당신이 세터에 기능을 주입 할 수없는 것 같은데? – AaronLS

+0

그러나 스레드에서 논리 문제를 해결하십시오. 실현 된 Swing 구성 요소의 _any_ 속성에 액세스하는 것이 _ EDT – kleopatra

답변

7

즉시 그 필요가 정확히 일치하는 않는 방법 "즉시"

가 변경 될 때 응답? while 루프에 Thread.sleep(10)을 추가하면 CPU로드가 거의 0이됩니다.

이 작업을 수행하는 더 좋은 방법은 무엇입니까? (정수를 변경하는 메소드를 변경할 수 없다고 가정하십시오.)

더 좋은 방법은 필드를 직접 노출하지 않는 것입니다. 캡슐화의 이점에 대한 훌륭한 예는 setter 메소드를 사용하면 관찰자 패턴을 구현하는 것이 쉽습니다.

+0

에서 이미 발생했음을 잊지 마십시오. Thread.sleep (10)을 이미 시도했지만 여전히 매우 높게 유지되었습니다. 내 프로젝트에서 모니터해야하는 정수는 JPanel에 캡슐화되어 있으며 getter/setter 메서드를 사용하여 수정합니다. 프로젝트가 작성된 방식 때문에 그렇게 할 수 없습니다. 내 원래 게시물을 수정하여 더 나은 아이디어를 얻을 수 있도록 노력하겠습니다. – n00neimp0rtant

1

Thread.sleep(1);을 추가하여 CPU를 절약 해보십시오.

7

해당 int가 JavaBean의 속성 일 경우 PropertyChangeListener을 사용할 수 있습니다.

그러나 값 변경을 위해 정수를 모니터해야하는 경우 디자인 문제가있는 것으로 생각됩니다. 정수가 어떤 메서드를 통해서만 변경 될 수 있는지 확인하고 메서드가 이전 값과 새 값을 기반으로 필요한 논리를 처리하는지 확인하는 것이 좋습니다.

0

CPU를 절약하기 위해 변수의 값을 시간별로 확인할 수 있습니다. 또는 패턴을 사용하십시오 Observer

0

정수를 다른 클래스에 캡슐화하고 setter 및 getter로 감싸고 Observer를 통해 알림을 추가 할 수 있습니까?

2

대기/알림을 사용할 수 있습니다. ExecutorService를 사용할 수 있습니다. 정수가 설정된 코드를 변경할 수 있는지 여부에 따라 많은 영향을받습니다.

+0

나는 할 수 없다. 한 번 살펴 보려는 경우 코드 예제를 완전히 변경하여 왜 이렇게해야하는지 더 잘 시각화 할 수 있습니다. – n00neimp0rtant

0

정수를 실제로 설정하는 코드를 변경할 수 없다고 가정하면 할 수있는 일이 많지 않습니다. 즉, 각 패스가 끝날 때 Thread.yield()를 호출하면 스레드가 다른 응용 프로그램의 성능에 미치는 영향이 최소화됩니다.

관련 문제