Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Отложенное использование кода "в основном потоке"

Статус
Закрыто для дальнейших ответов.

Dymeth

Активный участник
Пользователь
Баллы
98
Имя в Minecraft
Dymeth
Добрых суток.
Недавно задался, казалось бы, простым вопросом: как реализовать "прерывание выполнения" в основном потоке.
На ум приходит - создать таймер (по сути это отдельный поток), в его теле прописать обычный слип и автоостановку. Хорошо, тогда как "дождаться" завершения таймера? Помнится, использовал различные шедулеры, различные методы типо .join(). Но по непонятным для меня причинам все это дело либо просто не работало, либо кидало адские исключения.

Естественно, усыплять основной поток нельзя.
Пихать кучу кода в отдельный - тоже не вариант. Мало того, что это некомфортно, так ещё и многие баккитовские методы отказываются работать "не в своей тарелке".

В качестве примера реализации можно привести туториал на Плексе (или Хайпе, точно не помню): сообщение, ожидание, телепортация. Но там, скорее всего, весь туториал выполняется отдельным потоком. Мне же, как я указал выше, это крайне неудобно.

Идеальным вариантом был бы какой-нибудь метод cooldown(int time).
Да, звучит глупо, согласен. Но что поделать...

У кого какие мысли и предложения?
 
Последнее редактирование:
Использую шедулер, и в ус не дую.
 
Чедулер - единственный безопасный способ вызвать отложенное исполнение кода.
Можно конечно исхитриться и сделать обертку с JDeferred
будет что-то вроде:
Java:
timeout(200).then(() => {
    // ... действие через 200 тиков
    return timeout(100);
}).then(() => {
    // ... действие через 200 + 100 тиков
    return timeout(500);
});
 
Использую шедулер, и в ус не дую.
А как "дождаться" его завершения? Или как-то по-другому стоит действовать? Можно конкретный примерчик?

Можно конечно исхитриться и сделать обертку с JDeferred
Ни разу не работал с JDeferred. Попробую. Спасибо за пример.
 
А как "дождаться" его завершения? Или как-то по-другому стоит действовать? Можно конкретный примерчик?
Ну а что сложного? В буккит шедулере есть отложенные задания, а не только таймеры. Когда оно выполнится, можно вызвать колбек метод
 
Прочитай первый пост: http://rubukkit.org/threads/98179/
Как я понял, у автора вопрос поставлен близко к моему.

Приведённый в начале код = тело параллельного потока.
 
Уже читал

http://rubukkit.org/threads/98179/
Приведённый в начале код = тело параллельного потока.
Не совсем уловил суть. Но, кажется, это не то. Хотя возможно мне просто не хватает знаний Java.

Ну а что сложного? В буккит шедулере есть отложенные задания, а не только таймеры. Когда оно выполнится, можно вызвать колбек метод
Это понятно. Но использование колбек-метода - опять же неудобно. Хотелось бы обойтись без дополнительных заморочек. Если вновь говорить о туториале, то хотелось бы сделать примерно так:
- Начало туториала
- В обычном цикле последовательное выполнение команд(
-- Сообщение
-- Метод ожидания
-- Телепортация)
- Конец туториала

Сейчас понял, что так невозможно. Поэтому придётся вынести отдельно метод выполнения одной команды (например, runNextCommand()). И в методе ожидания после Thread.sleep() обратно вызывать этот самый runNextConmand(). Какая-то неудобная скачка по коду, лишние телодвижения типо создания списка команд и управления счётчиком номера команды. Неудобно же. Но выбирать не приходится.

Что ж, всем спасибо. Тема закрыта.
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.

Поделиться этой страницей

Назад
Верх