11-06-2012, 10:38 AM
Немного зашел в тупик, поэтому не откажусь от совета.
Вопрос в следующем. Как корректно закрыть таск, ссылка на который записывается в _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]
ЗЫ: За гавнокод просьба не ругать.
Вопрос в следующем. Как корректно закрыть таск, ссылка на который записывается в _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]
ЗЫ: За гавнокод просьба не ругать.