Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Остановка ScheduledFuture
#1
Немного зашел в тупик, поэтому не откажусь от совета.

Вопрос в следующем. Как корректно закрыть таск, ссылка на который записывается в _delayedTask?
Проблема в том, что таск создается несколько раз (собственно видно из цикла и по сути ссылка перезаписывается).
Где должен закрываться _delayedTask видно по коду.

[src=java]

static class TaskTemporaryHero implements Runnable
{
ArrayList<Integer> _players = null;

@Override
public void run() {
_players = getTopPvpPlayer();
if (_players != null && !_players.isEmpty())
{
for (Integer charId : _players)
{
L2PcInstance player = L2World.getPlayer(charId);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.add(Calendar.MINUTE,HERO_TIME);
if (player == null) // На случай, если не был онлайн во время выдачи награды
_delayedTask = ThreadPoolManager.scheduleAtFixedRate(new TaskDelayedTemporaryHero(charId,cal.getTimeInMillis()), 1000, 60000);
else if (!checkCondition(player))
_delayedTask = ThreadPoolManager.scheduleAtFixedRate(new TaskDelayedTemporaryHero(charId,cal.getTimeInMillis()), 1000, 60000);
else
TemporaryHeroTask.setTemporaryHero(player);
}
}
else
_log.info("TemporaryHeroHask : there is no players to set Hero for top PvP.");
}
}

static class TaskDelayedTemporaryHero implements Runnable
{
int _charId = 0;
long _time = 0;

TaskDelayedTemporaryHero(int charId, long time)
{
_charId = charId;
_time = time;
}

@Override
public void run() {
if (_charId != 0)
{
L2PcInstance player = L2World.getPlayer(_charId);
if (player != null && checkCondition(player))
{
setDelayedTemporaryHero(player,_time);
_delayedTask.cancel(true);
}
}
else
_log.warn("TaskDelayedTemporaryHero : charId = 0");
}
}

[/src]

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

[src=java]
_delayedTask = ThreadPoolManager.scheduleAtFixedRate(new TaskDelayedTemporaryHero(charId,cal.getTimeInMillis(), _delayedTask), 1000, 60000);
[/src]


ЗЫ: За гавнокод просьба не ругать.
Ответ
#2
псевдокод:

Код:
TaskDelayedTemporaryHero closer = new TaskDelayedTemporaryHero(charId,cal.getTimeInMillis());
closer.setTask(ThreadPoolManager.scheduleAtFixedRate(closer , 1000, 60000));

....

Код:
static class TaskDelayedTemporaryHero implements Runnable
    {
        ...
        Future<?> _delayedTask;
        
        ...

        void setTask(Future<?> task)
       {
             _delayedTask = task;
       }
    }
l2jfree | M.O.R.F. | A.P.S. | Aion | GW2 | BnS
Ответ
#3
Может быть следует хранить список или мапу тасков? Можно цеплять, например, по charId.
И, собственно, зачем куча тасков под каждого игрока? Передавайте в Runnable список игроков и будет у Вас один таск. Не думаю, что в этом классе очень уж критично параллельная выдача временного геройства для каждого игрока.

// Отдать Future в сам таск тоже оригинально :plus1:
// aka Deft
Ответ
#4
Yorie Написал:И, собственно, зачем куча тасков под каждого игрока? Передавайте в Runnable список игроков и будет у Вас один таск.

В любом случае получится 2 списка. Те кто готов получить геройство и те кто либо не онлайн, либо не удовлетворяет условиями. На первый взгляд в плане кода получаются огороды. Хотя таски под каждого персонажа такие же огороды. Вообщем попробуемс и по вашему варианту Smile

В целом разобрался. Спасибо всем, кто откликнулся.
Ответ
#5
// del, не смотрел ответы
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Остановка опыта molot1 4 2,430 07-21-2013, 04:54 PM
Последний пост: Zeratyl

Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)