Помогите Потоки

  • Автор темы Автор темы AlexMor
  • Дата начала Дата начала

AlexMor

Активный участник
Пользователь
Баллы
76
Здравствуйте, как можно создавать новый поток (в потоке: цикл повторяющийся каждую минуту, и проверку, если игрок онлайн то вызывать другой метод) для каждого зашедшего игрока, причем по 1 потоку на игрока.

Цель: каждую минуту забирать у игрока определенное кол-во денег если он онлайн.
 
Здравствуйте, как можно создавать новый поток (в потоке: цикл повторяющийся каждую минуту, и проверку, если игрок онлайн то вызывать другой метод) для каждого зашедшего игрока, причем по 1 потоку на игрока.

Цель: каждую минуту забирать у игрока определенное кол-во денег если он онлайн.
Как то вроде через HashMap можно... Но как
 
Как то вроде через HashMap можно... Но как
Код:
private HashMap<Player, Thread> players = new HashMap<Player, Thread>();

@EventHandler
public void onJoin(PlayerJoinEvent e) {
   Thread t = new Thread() {
      public void run() {
         while(true) {
            minusMoney(e.getPlayer());
            Thread.sleep(5000);
         }
      }
   };
   players.put(e.getPlayer(), t);
   t.start();
}

@EventHandler
public void onLeave(PlayerLeaveEvent e) {
   players.get(e.getPlayer()).stop();
   players.remove(e.getPlayer());
}
Как-то так, писал с планша, поэтому могут быть ошибки где-то.
 
Код:
private HashMap<Player, Thread> players = new HashMap<Player, Thread>();

@EventHandler
public void onJoin(PlayerJoinEvent e) {
   Thread t = new Thread() {
      public void run() {
         while(true) {
            minusMoney(e.getPlayer());
            Thread.sleep(5000);
         }
      }
   };
   players.put(e.getPlayer(), t);
   t.start();
}

@EventHandler
public void onLeave(PlayerLeaveEvent e) {
   players.get(e.getPlayer()).stop();
   players.remove(e.getPlayer());
}
Как-то так, писал с планша, поэтому могут быть ошибки где-то.
Сяпки. поржал. :D
 
Для таких вещей потоки не нужны. Достаточно использовать шедулер. Это такая штука, которая в одном единственном потоке выполняет все задачи - либо единоразово, либо каждый раз повторяет с определенной задержкой. Тебе нужно добавить как раз такую задачу. Подробнее о шедулерах можно почитать в других темах или в интернете.
Код:
private HashMap<Player, Thread> players = new HashMap<Player, Thread>();

@EventHandler
public void onJoin(PlayerJoinEvent e) {
   Thread t = new Thread() {
      public void run() {
         while(true) {
            minusMoney(e.getPlayer());
            Thread.sleep(5000);
         }
      }
   };
   players.put(e.getPlayer(), t);
   t.start();
}

@EventHandler
public void onLeave(PlayerLeaveEvent e) {
   players.get(e.getPlayer()).stop();
   players.remove(e.getPlayer());
}
Как-то так, писал с планша, поэтому могут быть ошибки где-то.
Сяпки, поржал [х2]
На каждого игрока по потоку... Жирно очень. От десяти заполненных серверов умрёт любой хост.
 
Для таких вещей потоки не нужны. Достаточно использовать шедулер. Это такая штука, которая в одном единственном потоке выполняет все задачи - либо единоразово, либо каждый раз повторяет с определенной задержкой. Тебе нужно добавить как раз такую задачу. Подробнее о шедулерах можно почитать в других темах или в интернете.
Сяпки, поржал [х2]
На каждого игрока по потоку... Жирно очень. От десяти заполненных серверов умрёт любой хост.
Он попросил - я сделал. В чем проблема?
Все, что ты написал - я и так знаю, но это его требования.
Для таких вещей потоки не нужны. Достаточно использовать шедулер. Это такая штука, которая в одном единственном потоке выполняет все задачи - либо единоразово, либо каждый раз повторяет с определенной задержкой. Тебе нужно добавить как раз такую задачу. Подробнее о шедулерах можно почитать в других темах или в интернете.
Сяпки, поржал [х2]
На каждого игрока по потоку... Жирно очень. От десяти заполненных серверов умрёт любой хост.
Шулдерами, кстати, я не пользовался. Может стоит апи как-то почитать...
 
А зачем д
Он попросил - я сделал. В чем проблема?
Все, что ты написал - я и так знаю, но это его требования.

Шулдерами, кстати, я не пользовался. Может стоит апи как-то почитать...
И заодно API ProtocolLib'а :)
 
Ты меня осуждаешь за это или что?
Мне хватало знаний базового языка без лишнего апи, будет надо что-то новое - выучу.
Я не осуждаю) Каждый в праве пользоваться чем угодно, вопрос лишь в том, что лучше. Вдруг при сравнении работы твоих утилит с ProtocolLib выяснится, что они работают гораздо быстрее
 
Если уж и создавать на каждого игрока по потоку, то хотя бы с пулом.
 
Да ничего там не случится, ты же там не степень вычисляешь.
Это конечно, так.Но если есть возможность оптимизировать, то почему бы ею не воспользоваться?
TS, такой вариант устроит?
Java:
scheduler.scheduleSyncRepeatingTask(plugin, () -> {
    for (Player player : plugin.getServer().getOnlinePlayers())
        player.decrementMoney(params);
}, 0L, 1200L);
 
Это конечно, так.Но если есть возможность оптимизировать, то почему бы ею не воспользоваться?
TS, такой вариант устроит?
Java:
scheduler.scheduleSyncRepeatingTask(plugin, () -> {
    for (Player player : plugin.getServer().getOnlinePlayers())
        player.decrementMoney(params);
}, 0L, 1200L);
Ага збс оптимизировал :D. getOnlinePlayers(). Сяпки - поржал. Так держать!
 
Ага збс оптимизировал :D. getOnlinePlayers(). Сяпки - поржал. Так держать!
Да не оптимизировал я там ничего.Я не думаю, что автор пишет для вайма, если захочет уже сам напишет хранилище для игроков, я лишь общий код привёл.
 
Сегодня задавался вопросом о скорости работы этого метода, но его код так и не смог найти. Вероятно, Вы знаете, как он работает. Подскажите, насколько он быстр и где его использовать не рекомендуется?
 
Сегодня задавался вопросом о скорости работы этого метода, но его код так и не смог найти. Вероятно, Вы знаете, как он работает. Подскажите, насколько он быстр и где его использовать не рекомендуется?
Потому что данный метод проходится по всем игрокам, которые когда то были на сервер и проверят isOnline();
По этому причине рекомендуется делать свой собственный метод getOnlinePlayer(name); с помощь эвентов Входа и Выхода игроков заносить\удалять игроков в HashSet<Player>.
 
Потому что данный метод проходится по всем игрокам, которые когда то были на сервер и проверят isOnline();
По этому причине рекомендуется делать свой собственный метод getOnlinePlayer(name); с помощь эвентов Входа и Выхода игроков заносить\удалять игроков в HashSet<Player>.
Чего...
Код:
private final List<CraftPlayer> playerView;

public CraftServer(MinecraftServer console, PlayerList playerList) {
   ...
   this.playerView = Collections.unmodifiableList(Lists.transform(playerList.players, new Function() {
       public CraftPlayer apply(EntityPlayer player) {
           return player.getBukkitEntity();
       }
   }));
   ...
}
Код:
public final List<EntityPlayer> players = new CopyOnWriteArrayList();

public void onPlayerJoin(EntityPlayer entityplayer, String joinMessage) {
    this.players.add(entityplayer);
    ...
}

public String disconnect(EntityPlayer entityplayer) {
    ...
    this.players.remove(entityplayer);
    ...
}
 
Последнее редактирование:
Разве с Bukkit можно взаимодействовать не с основного потока?
 
Назад
Верх