Эффективно контролировать значение int - PullRequest
2 голосов
/ 04 ноября 2011

Я изменил код на более подробную версию, чтобы вы могли лучше понять мою проблему.

Мне нужно «посмотреть» целочисленное значение и немедленно реагировать на его изменение. На данный момент лучший способ, который я нашел, - это использование потока в бесконечном цикле.

Ниже приведена значительно упрощенная часть моего проекта. Подводя итог, можно сказать, что дляtificationValue устанавливается значение 1 одним нажатием кнопки в моем классе Bubble. Мне нужно, чтобы апплет мог отслеживать это значение уведомления и отвечать каждый раз, когда он изменяется.

Вот мой апплет:

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% и совсем не эффективен. Что было бы лучшим способом сделать это? (Предположим, я не могу изменить ни один из методов, ответственных за изменение целого числа.)

Ответы [ 7 ]

7 голосов
/ 04 ноября 2011

немедленно реагирует на изменения

Насколько "немедленным" это должно быть точно? Добавление Thread.sleep(10) в ваш цикл while может снизить нагрузку на ваш процессор почти до нуля.

Что может быть лучше для этого? (Предположим, я не могу изменить ни один из методов, ответственных за изменение целого числа.)

Лучшим способом было бы не выставлять поля напрямую. Отличный пример преимуществ инкапсуляции - использование метода сеттера сделает реализацию схемы наблюдателя тривиальной.

7 голосов
/ 04 ноября 2011

Если это int является свойством JavaBean, вы можете использовать PropertyChangeListener .

Тем не менее, я подозреваю, что если вам нужно отслеживать какое-то целое число для изменения значения, у вас есть проблема дизайна. Было бы лучше убедиться, что целое число можно изменить только с помощью какого-либо метода, и убедиться, что метод обрабатывает требуемую логику на основе старых и новых значений.

2 голосов
/ 04 ноября 2011

Вы можете использовать ожидание / уведомление. Вы можете использовать ExecutorService. Многое зависит от того, можете ли вы изменить код, в котором установлено целое число.

1 голос
/ 04 ноября 2011

Попробуйте добавить Thread.sleep(1); для экономии ресурсов процессора.

0 голосов
/ 04 ноября 2011

Предполагая, что вы не можете изменить код, который фактически устанавливает целое число, вы мало что можете сделать. Тем не менее, если вы будете вызывать Thread.yield () в конце каждого прохода, влияние потока на производительность других приложений будет минимальным.

0 голосов
/ 04 ноября 2011

Не могли бы вы инкапсулировать целое число в другом классе, обернуть с помощью установщика и получателя и добавить уведомление (через наблюдателя)?

0 голосов
/ 04 ноября 2011

Время от времени вы можете проверять значение вашей переменной для экономии ресурсов процессора.Или используйте шаблон Наблюдатель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...