Programming Assignment Unit 3
Simple Clock Application with Java Threads
1. Introduction
This assignment implements a simple clock application using Java threads to display the
current time and date concurrently. The program demonstrates practical application of Java
Thread model basics while illustrating the use of threads and their priorities in a real-life
scenario. The system utilizes multithreading to ensure continuous time updates in the
background while maintaining a responsive display interface.
The implementation emphasizes proper thread management through the use of Java
Thread class and synchronization mechanisms, ensuring reliable timekeeping and display
operations. The system is organized with clear separation between time updating and display
functionalities, with the display thread having higher priority for better precision as required.
Key features of the system include continuous time updates, thread priority management
for precision, proper synchronization for thread-safe operations, and graceful shutdown
mechanisms. The program demonstrates sophisticated understanding of Java threading through
appropriate thread creation, priority setting, and interrupt handling.
This clock solution provides a foundation for understanding concurrent programming in
Java while serving as an exemplary demonstration of thread management, synchronization, and
real-time system design in a practical application context.
2. Program Code
i. Program Structure in Eclipse
Screenshot 1: Eclipse Package Explorer showing project structure with [Link]
ii. [Link] implementation:
Screenshot 2: Clock Class code in eclipse
3. Code Explanation
Program Structure and Design:
The Clock Application is implemented in a single Java file ([Link])
containing four distinct class definitions that work together. This single-file approach maintains
clear separation between time updating and display functionalities while simplifying program
structure. The system follows concurrent programming principles with synchronization at its
core, using synchronized methods to control access to shared resources and proper thread
priority management for precision timekeeping.
Key Components Within the Single File:
a) Clock Class:
Represents the time-keeping mechanism with attributes: currentTime (String)
and formatter (DateTimeFormatter)
Located in the same file, allowing direct access by other classes without imports
Includes thread-safe synchronized methods: updateTime() and getTime()
Uses synchronized keyword to prevent race conditions between concurrent threads
Implements time formatting using [Link]("HH:mm:ss dd-MM-
yyyy")
Initializes with current system time during object construction
b) TimeUpdaterThread Class:
Manages background time updates at precise 1-second intervals
Extends Thread class for concurrent operation within the same file
Implements lower thread priority (Thread.MIN_PRIORITY = 1) for background
operations
Uses volatile boolean running flag for thread-safe termination control
Handles InterruptedException properly during sleep interruptions
Sets thread name to "TimeUpdaterThread" for clear identification
Runs in continuous loop with 1000ms intervals, calling [Link]()
c) TimeDisplayThread Class:
Manages time display at 500ms intervals for smooth, frequent updates
Extends Thread class within the same file for concurrent operation
Implements higher thread priority (Thread.MAX_PRIORITY = 10) for display precision
Includes interrupt handling for proper thread termination
Provides real-time console output with consistent formatting
Sets thread name to "TimeDisplayThread" for debugging clarity
Runs in continuous loop with 500ms intervals, calling [Link]()
Displays application startup messages and visual separators
d) Main Application Class (ClockApplication):
Serves as the entry point with main() method
Coordinates thread creation, management, and lifecycle within the same file
Demonstrates thread priority configuration through console output
Implements 30-second runtime with automatic graceful shutdown
Creates shared Clock instance for inter-thread communication
Ensures proper thread termination using stopThread() and join() methods
Handles InterruptedException for robust error handling
Provides clear status messages throughout program execution
Thread Priority Implementation in Single File:
All priority settings are configured and visible within the same Java file:
o Display thread: setPriority(Thread.MAX_PRIORITY) - Priority 10 for immediate
response
o Updater thread: setPriority(Thread.MIN_PRIORITY) - Priority 1 for background
operation
o Main thread: Default NORM_PRIORITY (5) for coordination
Priority difference demonstrated by display thread executing before updater thread
Synchronization Implementation Within Shared File:
synchronized methods in Clock class prevent concurrent modification issues
All classes access the same Clock instance created in main method
volatile boolean flags ensure cross-thread visibility for termination signaling
Proper interrupt handling allows graceful shutdown from main thread
join() methods ensure completion synchronization before program exit
4. Program Execution
The program executes in a structured sequence demonstrating all clock functionalities:
Execution Steps:
1. Compile the Java file: javac [Link]
2. Run the application: java ClockApplication
Program Flow:
System initialization with welcome message
Thread priority display and configuration
Concurrent thread startup (updater and display)
Continuous time updates and display
Graceful shutdown after 30 seconds
Thread termination and cleanup
5. Program Output
Screenshot 3: Complete program execution output showing thread initialization, priority
settings, continuous time updates, and graceful shutdown
6. Conclusion
The Clock Application successfully demonstrates concurrent timekeeping functionality through
practical Java threading implementation. The program showcases efficient thread management
using proper priorities, providing robust time updates and display capabilities with precision
control.
The implementation effectively meets all assignment requirements through:
Thread Implementation Success:
Clear separation of concerns using dedicated threads for updating and display
Proper use of Thread class and synchronization mechanisms
Logical organization of concurrent operations for maintainability
Thread Priority Achievement:
Display thread assigned MAX_PRIORITY (10) for timely updates
Updater thread assigned MIN_PRIORITY (1) for background operation
Effective demonstration of priority-based scheduling
Functionality Implementation:
Complete time management with continuous updates
Robust thread synchronization preventing race conditions
Proper time formatting as per requirements ("HH:mm:ss dd-MM-yyyy")
Effective error handling and interrupt management throughout the system
The use of concurrent programming principles results in reliable, efficient, and extensible code
that demonstrates sophisticated understanding of Java threading and real-time system design.
The system provides a solid foundation that could be extended with additional features such as
GUI interface, alarm functionality, or timezone support.
This assignment successfully illustrates the importance of proper thread management in building
responsive applications while meeting all specified technical requirements for thread usage,
priorities, and clock functionality.
7. References
Oracle. (2023). Java SE 17 Documentation - Thread Class. Retrieved from
[Link]
Oracle. (2023). Java SE 17 Documentation - Thread Priorities. Retrieved from
[Link]
Oracle. (2023). Java SE 17 Documentation - DateTimeFormatter. Retrieved from
[Link]
[Link]
Oracle. (2023). Java Tutorials - Concurrency. Retrieved from
[Link]
Eclipse Foundation. (2023). Eclipse IDE User Guide. Retrieved from
[Link]