NetBeans / Java / Новая подсказка: Thread.sleep вызывается в цикле

В NetBeans есть новый совет, который говорит: Thread.sleep вызывается в цикле.

Вопрос 1: Как / когда это может быть проблемой, чтобы спать в цикле?

Вопрос 2: Если это проблема, что мне делать вместо этого?

ОБНОВЛЕНИЕ: Вопрос 3: Вот некоторые код. Скажите мне в этом случае, если я должен использовать что-то другое вместо Thread.Sleep в цикле. Короче говоря, это используется сервером, который прослушивает клиентские TCP-соединения. Спящий режим используется здесь в случае достижения максимального количества сеансов с клиентами. В этой ситуации я хочу, чтобы приложение дождалось, пока освободится бесплатный сеанс.

public class SessionManager {
    private static final int DEFAULT_PORT = 7500;
    private static final int SLEEP_TIME = 200;
    private final DatabaseManager database = new DatabaseManager();
    private final ServerSocket serverSocket = new ServerSocket(DEFAULT_PORT);

public SessionManager() throws IOException, SQLException
{
}

public void listen()
{
while (true)
    if (Session.getSessionCount() < Session.getMaxSessionCount())
        try
        {
             new Thread(new Session(database, serverSocket.accept())).start();
        }
        catch (IOException ex) { ex.printStackTrace(); }
    else
        try
        {
            Thread.sleep(SLEEP_TIME);
        }
        catch (InterruptedException ex) { ex.printStackTrace(); }
}

public static void main(String[] args) throws IOException, SQLException
{
new SessionManager().listen();
}
}
47
задан Mr_and_Mrs_D 5 December 2011 в 20:54
поделиться

2 ответа

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

while (true) {
    if (stream.available() > 0) {
       // read input
    }
    sleep(MILLISECONDS);
}

Если MILLISECONDS слишком велико, этому коду потребуется много времени, чтобы понять, что ввод доступен.

Если MILLISECONDS слишком мало, то этот код будет тратить впустую много системных ресурсов на проверку ввода, который еще не поступил.

Другое использование сна в цикле также обычно вызывает сомнения. Обычно есть способ получше.

Если это проблема, что мне делать вместо этого?

Разместите код, и, возможно, мы сможем дать вам разумный ответ.

РЕДАКТИРОВАТЬ

ИМО, лучший способ решить проблему - использовать ThreadPoolExecutor .

Примерно так:

public void listen() {
    BlockingQueue queue = new SynchronousQueue();
    ThreadPoolExecutor executor = new ThreadPoolExecutor(
            1, Session.getMaxSessionCount(), 100, TimeUnit.SECONDS, queue);
    while (true) {
        try {
            queue.submit(new Session(database, serverSocket.accept()));
        } catch (IOException ex) { 
            ex.printStackTrace();
        }
    }
}

Это настраивает исполнителя в соответствии с тем, как ваш код работает в настоящее время. Есть несколько других способов сделать это; см. ссылку на javadoc выше.

22
ответ дан 26 November 2019 в 19:56
поделиться

Как / когда может возникнуть проблема с засыпанием в цикле?
Люди иногда используют его вместо надлежащих методов синхронизации (например, ожидания / уведомления).

Если это проблема, что мне делать вместо этого?
Зависит от того, что вы делаете. Хотя мне сложно представить ситуацию, когда это будет наилучшим подходом, я думаю, что это тоже возможно.

Вы можете ознакомиться с учебником Sun по параллелизму по этой теме.

2
ответ дан 26 November 2019 в 19:56
поделиться
Другие вопросы по тегам:

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