package net.md_5.bungee.scheduler;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import lombok.Data;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.api.scheduler.ScheduledTask;
@Data
public class BungeeTask implements Runnable, ScheduledTask
{
private final BungeeScheduler sched;
private final int id;
private final Plugin owner;
private final Runnable task;
//
private final long delay;
private final long period;
private final AtomicBoolean running = new AtomicBoolean( true );
public BungeeTask(BungeeScheduler sched, int id, Plugin owner, Runnable task, long delay, long period, TimeUnit unit)
{
this.sched = sched;
this.id = id;
this.owner = owner;
this.task = task;
this.delay = unit.toMillis( delay );
this.period = unit.toMillis( period );
}
@Override
public void cancel()
{
boolean wasRunning = running.getAndSet( false );
if ( wasRunning )
{
sched.cancel0( this );
}
}
@Override
public void run()
{
if ( delay > 0 )
{
try
{
Thread.sleep( delay );
} catch ( InterruptedException ex )
{
Thread.currentThread().interrupt();
}
}
while ( running.get() )
{
try
{
task.run();
} catch ( Throwable t )
{
ProxyServer.getInstance().getLogger().log( Level.SEVERE, String.format( "Task %s encountered an exception", this ), t );
}
// If we have a period of 0 or less, only run once
if ( period <= 0 )
{
break;
}
try
{
Thread.sleep( period );
} catch ( InterruptedException ex )
{
Thread.currentThread().interrupt();
}
}
cancel();
}
}