HappyBirthday.java openjdk 21
// HappyBirthday.javapublic class HappyBirthday {  private static final Logger log = getLogger(HappyBirthday.class);   static final String NAME = "Alex";  static final String FROM = "UIM colleagues";   public static void main(String[] args) throws Exception {    var cake = new Cake(7);    var card = new Card(cake, NAME, FROM);    var candlesOut = new CountDownLatch(cake.size());    cake.onCandleOut(candle -> candlesOut.countDown());     for (Candle c : cake.candles()) {      c.light();      log.debug("Candle {}/{} lit", c.index() + 1, cake.size());    }    card.congratulate();     candlesOut.await();   // park until the cake is dark    card.manyHappyReturns();  }}

// waiting for the first candle

A two-tier chocolate cake with candles

application.log stopped
// waiting for the JVM