Design a multi-timer using single underlying timer

Quick Overview

This question evaluates a candidate's ability to implement timer scheduling, resource multiplexing, and concurrency control using constrained system primitives, testing understanding of timers, event handling, data structures, and correctness under race conditions.

Design a multi-timer using single underlying timer

Company: Google

Role: Software Engineer

Category: Software Engineering Fundamentals

Difficulty: medium

Interview Round: Online Assessment

You are given a `Timer` class that has access to a *single* underlying system timer API that can only keep **one active timer at a time**. ### Underlying single-timer primitives (already available) ```java class Timer { // Schedule ONE timer to fire at `timestamp` (absolute time). // If called again, it overrides/cancels the previously scheduled system timer. private void setTimer(long timestamp); // Called automatically when the currently scheduled system timer expires. private void handleTimer(); // Returns current time as an absolute timestamp (same unit as setTimer). private long getCurrentTime(); // Public API: users can call this to schedule MANY timers. public void setNewTimer(long timestamp); } ``` ### Requirements - Users can only call `setNewTimer(timestamp)`. - `setNewTimer` must support **multiple** outstanding timers. - When any user timer expires, `handleTimer()` should be invoked (once per expired user timer). - You must implement the logic of the four methods so that multiple user timers are correctly managed on top of the single underlying `setTimer`. ### Clarifications you may assume - `timestamp` is an **absolute** time value (e.g., epoch milliseconds) comparable to `getCurrentTime()`. - Multiple user timers may share the same timestamp. - If a timer is set for a time ≤ `getCurrentTime()`, it should fire “immediately” (as soon as the system can schedule it). Discuss data structures, time/space complexity, and important edge cases (e.g., overrides, duplicate timestamps, and concurrency if relevant).

Overview: This question evaluates a candidate's ability to implement timer scheduling, resource multiplexing, and concurrency control using constrained system primitives, testing understanding of timers, event handling, data structures, and correctness under race conditions.

Google logo
Google
Dec 4, 2025
mediumSoftware EngineerOnline AssessmentSoftware Engineering Fundamentals
28
0

You are given a Timer class that has access to a single underlying system timer API that can only keep one active timer at a time.

Underlying single-timer primitives (already available)

class Timer {
  // Schedule ONE timer to fire at `timestamp` (absolute time).
  // If called again, it overrides/cancels the previously scheduled system timer.
  private void setTimer(long timestamp);

  // Called automatically when the currently scheduled system timer expires.
  private void handleTimer();

  // Returns current time as an absolute timestamp (same unit as setTimer).
  private long getCurrentTime();

  // Public API: users can call this to schedule MANY timers.
  public void setNewTimer(long timestamp);
}

Requirements

  • Users can only call setNewTimer(timestamp) .
  • setNewTimer must support multiple outstanding timers.
  • When any user timer expires, handleTimer() should be invoked (once per expired user timer).
  • You must implement the logic of the four methods so that multiple user timers are correctly managed on top of the single underlying setTimer .

Clarifications you may assume

  • timestamp is an absolute time value (e.g., epoch milliseconds) comparable to getCurrentTime() .
  • Multiple user timers may share the same timestamp.
  • If a timer is set for a time ≤ getCurrentTime() , it should fire “immediately” (as soon as the system can schedule it).

Discuss data structures, time/space complexity, and important edge cases (e.g., overrides, duplicate timestamps, and concurrency if relevant).