1 Kasım 2022 Salı

Delayed Arayüzü

Giriş
Şu satırı dahil ederiz
import java.util.concurrent.Delayed;
Delayed arayüzünün iki metodu var.
1. getDelay
2. compareTo

Kullanım
Şöyle yaparız. Burada future.getDelay() çağrılınca gelen değer 0 veya daha küçük bir şey olmalı. Çünkü ScheduledFuture yaratılınca bir zaman noktası alınıyor. getDelay() çağrılınca da 
"zaman noktası - now()" hesabı yapılıyor
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

ScheduledFuture<Integer> future = scheduler.schedule(new MyCallable(), 0, 
  TimeUnit.SECONDS));

assertTrue (future.getDelay(TimeUnit.SECONDS) <= 0);

getDelay metodu
İmzası şöyle
long getDelay(TimeUnit unit);
Belirtilen birim cinsinden ne kadar bekleneceğini döner. Sistem saati milisaniye cinsinden çalıştığı için, unit.convert() metodunun ikinci parametresi yani sourceUnit alanı TimeUnit.MILLISECONDS olur.

Örnek
Sistem saatine göre çalışan bir örnek için şöyle yaparız
public class DelayObject implements Delayed {
  private String data;
  private long startTime;

  public DelayObject(String data, long delayInMilliseconds) {
    this.data = data;
    this.startTime = System.currentTimeMillis() + delayInMilliseconds;
  }

  @Override
  public long getDelay(TimeUnit unit) {
    long diff = startTime - System.currentTimeMillis();
    return unit.convert(diff, TimeUnit.MILLISECONDS);
  }

  @Override
  public int compareTo(Delayed o) {
    return Ints.saturatedCast(
      this.startTime - ((DelayObject) o).startTime);
  }
}
compareTo metodu
Örnek
Şöyle yaparız
public class DelayObject implements Delayed {
  private String data;
  private long startTime;
  ...
  @Override
  public int compareTo(Delayed o) {
    return Ints.saturatedCast(
      this.startTime - ((DelayObject) o).startTime);
  }
}
compareTo() metodu int döndüğü ancak benim elimdeki sıralama için kullanılan alan long olduğu için farkı bulduktan sonra sonucu Ints.saturatedCast(long) metodu ile döneriz. Bu metod girdinin Integer.MAX_VALUE ve Integer.MIN_VALUE arasında olmasını garanti eder.

Örnek
Şöyle yaparız. Burada iki nesnenin expiryTime alanları karşılaştırılıyor
class PasswordExpirationNotification implements Delayed {
private String element; private long expiryTime; public PasswordExpirationNotification(int daysToExpiration) { this.element = "your password will expire tomorrow"; this.expiryTime = System.currentTimeMillis() + Duration.ofDays(daysToExpiration-1).toMillis(); } @Override public long getDelay(TimeUnit timeUnit) { long diff = expiryTime - System.currentTimeMillis(); return timeUnit.convert(diff, TimeUnit.MILLISECONDS); } @Override public int compareTo(Delayed o) { if (this.expiryTime < ((PasswordExpirationNotification) o).expiryTime) { return -1; } if (this.expiryTime > ((PasswordExpirationNotification) o).expiryTime) { return 1; } return 0; } }

Hiç yorum yok:

Yorum Gönder