Как заставить другой поток спать в Java

Походит , исполняемый JAR мог работать на Вас. Если Вы распределяете ZIP со всеми БАНКАМИ Ваши основные стандартные потребности, и Вы действительно выполняете его в командном процессоре, возможно, Вы могли создать исполняемый JAR с Основным Классом и Путем к классу, определенным в декларации. Все Ваши пользователи должны сделать, дважды щелкнуть по JAR и Вашему дяде Bob's.

6
задан A Jackson 2 October 2009 в 08:15
поделиться

3 ответа

Вы не можете перевести другой поток в спящий режим. (Вы можете использовать устаревший метод suspend () , но, пожалуйста, не делайте этого). Этот вызов:

this.sleep(200);

фактически переводит в спящий режим , выполняющий в настоящий момент поток, а не Thread , на который ссылается «this». sleep - статический метод - хорошие IDE выдадут предупреждение над этой строкой.

У вас должен быть просто флаг, говорящий «спать, пожалуйста», а затем заставить спящий поток проверять этот флаг перед выполнением какой-либо работы.

Это хорошо то, что нельзя перевести другой поток в спящий режим. Предположим, это синхронизированный метод - это будет означать, что вы удерживаете блокировку во время сна, заставляя всех остальных пытаться заблокировать ту же блокировку. Ничего хорошего. Используя систему на основе флагов,

24
ответ дан 8 December 2019 в 03:39
поделиться

Добавьте это в свой поток:

public AtomicBoolean waitLonger = new AtomicBoolean  ();
public Object lock = new Object ();

В run () :

synchronized (lock) {
    if (waitLonger.get ()) {
        lock.wait ();
    }
}

В другом потоке:

synchronized (lock) {
try {
    sleeper.waitLonger.set(true);
    ...
    lock.notify();
    sleeper.waitLonger.set(false);
}

Таким образом, вы можете заставить спящего ждать пока не будут завершены другие работы.

3
ответ дан 8 December 2019 в 03:39
поделиться

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

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

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

1
ответ дан 8 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

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