Помогите Выход из шедуллера runTaskTimer

SpokeKamchatka

Активный участник
Пользователь
Баллы
66
[РЕШЕНО]​
Привет
Нужно после выполнения условия в run(){} код выходил из шедуллера и шел дальше, пробовал ставить if(someboolean) return;
Но шедуллер идет дальше...

Хочу сделать что-то наподобие "Таймера для отсчета игры"

Вот, что у меня сейчас...
PHP:
Bukkit.getScheduler().runTaskTimer(this, new Runnable(){
                int k = 20;
                @Override
                public void run() {
                    k--;
                    p.playSound(p.getLocation(), Sound.BLOCK_LEVER_CLICK, 1, 1);
                    p.sendMessage(colorTranslator("&aИгра начнется через " + k + " секунд(а/у)"));
                    if(k <= 1) return;
                }
            }, 20, 20);
//colorTranslator(String) заменяет "&" на \u007a
//return не помогает...

Алекс Рендж, жду тебя : D
 
Последнее редактирование:
Чувак, все понимают что BukkitRunnable более читабельный, чем твое говно. Даже если смотреть не с точки зрения читабельности, а с точки зрения ООП то твой код так же остается полным говном
Говно, начнем с того, что я твоего мнения не спрашивал. И повторюсь, мой код работает и для меня более понятный.
 
Говно, начнем с того, что я твоего мнения не спрашивал. И повторюсь, мой код работает и для меня более понятный.
Я те сказал по общему принятому стандартну - ООП, с его точки твой код - говно, всем посрать что для тебя он читабельнее, мб для тебя вообще процедурки лучше ооп?
 
Я те сказал по общему принятому стандартну - ООП, с его точки твой код - говно, всем посрать что для тебя он читабельнее, мб для тебя вообще процедурки лучше ооп?
Возможно.
 
https://hastebin.com/ijoyecofib.java
Вот самый понятный и простой вариант.
Чувак, все понимают что BukkitRunnable более читабельный, чем твое говно. Даже если смотреть не с точки зрения читабельности, а с точки зрения ООП то твой код так же остается полным говном
ООП? Ну, тут явно нужны три парадигмы ООП, КОД КРИТИЧЕСКИЙ, ТО!
 
Задай себе вопрос: "Что я буду делать с полученным BukkitTask?"
Если ответ на него что-то вроде "отменять таск изнутри" - то тебе он не нужен, используй this.cancel() внутри BukkitRunnable. Меньше переменных - меньше шансов накосячить. И код понятнее.

Код:
new BukkitRunnable(){
   void run() {
      if (statement) {
         this.cancel();
      }
   }
}.runTaskTimer(plugin, 20L, 20L);
И всё. Ещё и на пару нс быстрее, но это не важно.
Ты же в курсе, что при выполнении runTaskTimer произойдет блокировка тела BukkitRunnable, и чет метод станет чуть чуть медленнее. (Аналогично с this.cancel()😉
 
https://hastebin.com/ijoyecofib.java
Вот самый понятный и простой вариант.

ООП? Ну, тут явно нужны три парадигмы ООП, КОД КРИТИЧЕСКИЙ, ТО!
Ну, а чего ты хотел то? Джава это оопшный язык. В ооп есть принципы, которые нужно использовать, если ты их не используешь, то код можно назвать говном.
 
https://hastebin.com/ijoyecofib.java
Вот самый понятный и простой вариант.

ООП? Ну, тут явно нужны три парадигмы ООП, КОД КРИТИЧЕСКИЙ, ТО!
Не, ну так код то вырастет этот, не будет же один шедулер ток, там 5 шедулеров если в коде, эт сколько говна то надо писать.
Ты же в курсе, что при выполнении runTaskTimer произойдет блокировка тела BukkitRunnable, и чет метод станет чуть чуть медленнее. (Аналогично с this.cancel()😉
Ля с чего бы он стал медленнее? Или ты про то, что там synchronized весит? В однопоточном коде эт никак не повлияет)
 
Ну, а чего ты хотел то? Джава это оопшный язык. В ооп есть принципы, которые нужно использовать, если ты их не используешь, то код можно назвать говном.
Три основных принципа из которых состоит ООП: наследование, инкапсуляция и полиморфизм. 1)Наследование. Если ты найдешь где тут его использовать, то можешь написать, даже интересно, как это у тебя получится. 2)Инкапсуляция. Это тестовый класс, а то есть тут изоляция от остальных модулей не нужна. 3)Полиморфизм. Ну он то тут точно нужен, да?
Не, ну так код то вырастет этот, не будет же один шедулер ток, там 5 шедулеров если в коде, эт сколько говна то надо писать.

Ля с чего бы он стал медленнее? Или ты про то, что там synchronized весит? В однопоточном коде эт никак не повлияет)
Процитирую: "One well-known source has cited that a synchronized method call is as much as 50 times slower than an unsynchronized method call.". (с) https://www.ibm.com/developerworks/library/j-threads1/index.html
 
"Не, ну так код то вырастет этот, не будет же один шедулер ток, там 5 шедулеров если в коде, эт сколько говна то надо писать. "
Только вот, код становится проще для понимания. Любой человек который хоть чуть чуть знает Javy, сможет с легкостью понять код и даже что-то в нём изменить. При этом, ваш метод с new BukkitRunnable() наоборот вгонит в заблуждение, и если у вас 5 таких шедулеров, то этому же кодеру придется долго разбираться, что к чему.
 
"Не, ну так код то вырастет этот, не будет же один шедулер ток, там 5 шедулеров если в коде, эт сколько говна то надо писать. "
Только вот, код становится проще для понимания. Любой человек который хоть чуть чуть знает Javy, сможет с легкостью понять код и даже что-то в нём изменить. При этом, ваш метод с new BukkitRunnable() наоборот вгонит в заблуждение, и если у вас 5 таких шедулеров, то этому же кодеру придется долго разбираться, что к чему.
Ты серьезно считаешь что вызвать сделать дополнительные филды в классе легче чем просто вызвать метод cancel() ?)

Три основных принципа из которых состоит ООП: наследование, инкапсуляция и полиморфизм. 1)Наследование. Если ты найдешь где тут его использовать, то можешь написать, даже интересно, как это у тебя получится. 2)Инкапсуляция. Это тестовый класс, а то есть тут изоляция от остальных модулей не нужна. 3)Полиморфизм. Ну он то тут точно нужен, да?

Процитирую: "One well-known source has cited that a synchronized method call is as much as 50 times slower than an unsynchronized method call.". (с) https://www.ibm.com/developerworks/library/j-threads1/index.html
Тут если че инкапсуляция как раз таки и подходит, тебе нужно как раз таки тот id шедулера по-хорошему инкапсулировать от других классов, сделать паблик геттер - надеюсь понимаешь, что хрень, так как это не инкапсуляция. Если по-хорошему делать, то у тебя как раз таки и получится тот же BukkitRunnable)

И вообще ты с многопоточностью собираешься работать без синхронизации?)
 
Хоть Java и считается в первую очередь ООП-языком, это не исключает возможности писать в других парадигмах (никто же не запретит писать в процедурном стиле?). Кроме того, что майнкрафт, что современный энтерпрайз — это уже скорее singleton oriented programming.
 
Ты серьезно считаешь что вызвать сделать дополнительные филды в классе легче чем просто вызвать метод cancel() ?)


Тут если че инкапсуляция как раз таки и подходит, тебе нужно как раз таки тот id шедулера по-хорошему инкапсулировать от других классов, сделать паблик геттер - надеюсь понимаешь, что хрень, так как это не инкапсуляция. Если по-хорошему делать, то у тебя как раз таки и получится тот же BukkitRunnable)

И вообще ты с многопоточностью собираешься работать без синхронизации?)
Ну, мне кажется, что жертвовать скоростью в такой мелочи нельзя.

Лол, нет. https://hastebin.com/ijoyecofib.java

Ни разу не было необходимости асинхронно работать с шедулером.
 
Моя очередь.
Код:
package Example;

import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask {
    private Timer timer;
    private int i;

    public MyTimerTask(Timer timer) {
        this.timer = timer;
    }

    @Override
    public void run() {
        i++;
        System.out.println(i);
        if (i == 10) {
            timer.cancel();
        }
    }
}

Код:
        Timer timer = new Timer();
        timer.schedule(new MyTimerTask(timer), 0, 1000);
 
Последнее редактирование:
Ну, мне кажется, что жертвовать скоростью в такой мелочи нельзя.

Лол, нет. https://hastebin.com/ijoyecofib.java

Ни разу не было необходимости асинхронно работать с шедулером.
Че чувак где там проседы скорости? Разница с синхронайздом будет видна ток при ~1000 вызововах. И то там там копейки будут с милисекундами
Хоть Java и считается в первую очередь ООП-языком, это не исключает возможности писать в других парадигмах (никто же не запретит писать в процедурном стиле?). Кроме того, что майнкрафт, что современный энтерпрайз — это уже скорее singleton oriented programming.
Ля ору чет. Где ты в майне увидел ентерпрайз?) И где ты увидел синглтоны кроме самого объекта плагина. Вообще если ты пишешь в процедурном стиле на яве тебя смело можно назвать отбросом
 
Последнее редактирование:
Че чувак где там проседы скорости? Разница с синхронайздом будет видна ток при ~1000 вызововах. И то там там копейки будут с милисекундами

Ля ору чет. Где ты в майне увидел ентерпрайз?) И где ты увидел синглтоны кроме самого объекта плагина. Вообще если ты пишешь в процедурном стиле на яве тебя смело можно назвать отбросом
У тебя там блок ссылок? Объясни, зачем замедлять то, что можно не замедлять! Раз так, предлагаю всю работу с локальной бд проводить в мейн треде. Задержка будет минимальной.
 
У тебя там блок ссылок? Объясни, зачем замедлять то, что можно не замедлять! Раз так, предлагаю всю работу с локальной бд проводить в мейн треде. Задержка будет минимальной.
Я без понятия, что ты хочешь делать без синхронайзда. Твой int localId может легко закешиться в локал буффере любого треда и все твое говно в миг порушится
 
Я без понятия, что ты хочешь делать без синхронайзда. Твой int localId может легко закешиться в локал буффере любого треда и все твое говно в миг порушится
Ты точно там впорядке? "Ни разу не было необходимости асинхронно работать с шедулером." чисто цитата одного из предыдущих сообщений. Насчет блокировки я зачекал. Брал я поиск простых чисел наивным методом, то есть асимптотика квадрат. Получилось так 906 ms - с блокировкой и 766 - без блокировки. Че пацаны пару мс?
 
Ты точно там впорядке? "Ни разу не было необходимости асинхронно работать с шедулером." чисто цитата одного из предыдущих сообщений. Насчет блокировки я зачекал. Брал я поиск простых чисел наивным методом, то есть асимптотика квадрат. Получилось так 906 ms - с блокировкой и 766 - без блокировки. Че пацаны пару мс?
Ты скок раз вызываешь метод с блокировкой?) Дохрена? Сколько раз ты вызываешь бакитовский мтеод cancel() ? Та и я почти уверен то, что у тебя даже тест написан неправильно. Та и вообще я без понятия как ты мог не работать асинхроно с шедулером, ну ладно, у меня это каждый второй таск
 
Назад
Верх