Как я могу мешать циклу с условием продолжения Java есть> 50% моего ЦП?

Большинство ответов здесь предполагали, что файл log4j.properties должен быть помещен в нужное место (для проекта maven он должен быть расположен в src/main/resources)

Но для меня проблема в том, что мой log4j.properties настроен неправильно. Вот пример, который работает для меня, вы можете попробовать его сначала.

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
19
задан Adeel Ansari 24 February 2009 в 04:14
поделиться

9 ответов

Добавьте сон для помещения потока в неактивный для некоторого интервала:

Thread.sleep

, не имея сна, цикл с условием продолжения использует все вычислительные ресурсы, который доступен. (Например, теоретически, 100% в одноядерной системе или 50% в двухъядерном, и так далее.)

, Например, следующее циклически повторится, после того как через while циклично выполняют приблизительно каждые 50 миллисекунд:

while (true)
{
    try
    {
        Thread.sleep(50);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

Это должно снизить загрузку ЦП вполне немного.

Со сном в цикле, операционная система также даст достаточно системного времени для других потоков и процессов, чтобы сделать их вещи, таким образом, система будет быстро реагирующей также. Назад в эпоху одноядерных систем и операционных систем с not-so-good планировщиками, циклы как это, возможно, сделали систему очень безразличной.

<час>

Начиная с темы использования while циклы для игры подошли, если игра собирается включить GUI, игровой цикл должен быть в отдельном потоке, или иначе сам GUI станет безразличным.

, Если программа будет основанной на консоли игрой, то поточная обработка не будет проблемой, но с графическими интерфейсами пользователя, которые событийно-ориентированы, имея долго живущий цикл в коде, сделает GUI безразличным.

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

следующее является примером приложения Swing, базирующегося в JFrame, который обновляет JLabel, который будет содержать возвращенное значение от System.currentTimeMillis. Процесс обновления происходит в отдельном потоке, и кнопка "Stop" остановит поток обновления.

Немного понятий пример проиллюстрирует:

  • А основанное на Swing приложение GUI с отдельным потоком для обновления времени - который Это предотвратит, запирается потока GUI. (Названный EDT или событием диспетчеризируют поток в Swing.)
  • Наличие while цикл с условием цикла, которое не является true, но замененный с boolean, который определит, поддержать ли цикл.
  • , Как Thread.sleep факторы в реальное приложение.

извините меня за долгий пример:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TimeUpdate
{
    public void makeGUI()
    {
        final JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JLabel l = new JLabel();

        class UpdateThread implements Runnable
        {
            // Boolean used to keep the update loop alive.
            boolean running = true;

            public void run()
            {
                // Typically want to have a way to get out of
                // a loop. Setting running to false will 
                // stop the loop.
                while (running)
                {
                    try
                    {
                        l.setText("Time: " +
                                System.currentTimeMillis());

                        Thread.sleep(50);
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }

                // Once the run method exits, this thread
                // will terminate.
            }
        }

        // Start a new time update thread.
        final UpdateThread t = new UpdateThread();
        new Thread(t).start();

        final JButton b = new JButton("Stop");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                t.running = false;
            }
        });

        // Prepare the frame.
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(l, BorderLayout.CENTER);
        f.getContentPane().add(b, BorderLayout.SOUTH);
        f.setLocation(100, 100);
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new TimeUpdate().makeGUI();
            }
        });
    }
}

Некоторые ресурсы о поточной обработке и использовании Swing:

43
ответ дан 30 November 2019 в 01:48
поделиться

Вы - действительно активное ожидание, подразумевая шлифование ЦП постоянно при проверке одного или нескольких условий, пока они не верны.

Thread.sleep() не решение. Используя wait() и notify() методы позволяют Вам делать, что Вы пробуете, но намного более эффективно. В основном этот механизм позволяет потоку спать на объекте, пока объект не решает, что что-то произошло и хочет разбудить все потоки, спящие на нем.

экс-клены Кода могут быть найдены здесь и здесь.

Это должно быть Вашим решением и не сокрытием Вашего активного ожидания с таймером.

10
ответ дан 30 November 2019 в 01:48
поделиться

Поток. Сон не может быть целым ответом. Для большинства игр существует слишком много ЦП для необходимого объема работы. Просто сон для количества времени набора не все это эффективное, так как Вы, вероятно, или все еще запишете слишком много ресурсов, или недостаточно. Вы обычно хотите ко времени свою работу в некотором роде.

, Если Вы думаете об этом, экран только обновляет на определенном уровне, обычно меньше чем 100 раз в секунду. Я не знаком с API Java для этого вида вещи, но что Вы хотите, должен узнать скорость обновления монитора и затем обновить только единственное время между каждым обновлением.

Далее, Вам не нужен цикл как этот для Вашего основного цикла, можно использовать таймеры для вызова кода обновления в равном интервале. Это еще более эффективно.

29
ответ дан 30 November 2019 в 01:48
поделиться

Обычно в игровом цикле Вы будете приостанавливаться некоторое время..., например: http://developers.sun.com/mobility/midp/articles/game/

6
ответ дан 30 November 2019 в 01:48
поделиться

В то время как да, Вы могли сделать

Thread.sleep(50)

как принятый ответ, предлагают, Вы могли также звонить

Thread.sleep(0) 

, Это скажет процессору делать контекстное переключение. Другие потоки, ожидающие, чтобы быть выполненными (как поток рисования GUI), будут тогда выполняться, и машина прекратит чувствовать себя медленной.

сон (0) путь также максимизирует время, данное ОС Вам приложение, потому что поток будет immediatly возвращаться в очереди процессора (вместо ожидания 50 мс прежде, чем сделать так) поэтому, если никакой другой поток, где, ожидая, Вы распараллелите, то продолжит выполняться.

7
ответ дан 30 November 2019 в 01:48
поделиться

Кажется, что Ваш поток является busywaiting. То есть это захватывается в цикле, в котором это ничего не делает. В такой ситуации это уничтожит много циклов CPU бесцельно.

, Как упомянуто другими, Thread.sleep является ответом.

0
ответ дан 30 November 2019 в 01:48
поделиться

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

0
ответ дан 30 November 2019 в 01:48
поделиться

Если существует прерывание, это, вероятно, по причине. Лучший способ обработать это

try {
    while (true) {
        Thread.sleep(50);
    }
} catch (InterruptException e) {
    Thread.currentThread().interrupt();
}

Однако, этот цикл ничего не делает, таким образом, я предлагаю, чтобы Вы просто удалили его. Довольно редко, чтобы Вы хотели к активному ожиданию условия (В этом случае, класс Условия является лучшим выбором), обычно, можно преобразовать то же поведение не нуждаться в цикле вообще.

0
ответ дан 30 November 2019 в 01:48
поделиться

Это связано с колебанием , но идея остается такой же: попытайтесь использовать Шаблон "наблюдатель" вместо wile(true).

0
ответ дан 30 November 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: