
- Groovy Tutorial
- Groovy - Home
- Groovy - Overview
- Groovy - Environment
- Groovy - Basic Syntax
- Groovy - Data Types
- Groovy - Variables
- Groovy - Optionals
- Groovy - Numbers
- Groovy - Strings
- Groovy - Ranges
- Groovy - Lists
- Groovy - Maps
- Groovy - Dates & Times
Groovy Operators
- Groovy - Operators
- Groovy - Arithmetic Operators
- Groovy - Assignment Operators
- Groovy - Relational Operators
- Groovy - Logical Operators
- Groovy - Bitwise Operators
- Groovy - Spaceship Operator
- Groovy - in Operator
- Groovy - Elvis Operator
- Groovy - Safe Navigation Operator
- Groovy Operator Precedence & Associativity
Control Statements
- Groovy - Decision Making
- Groovy - If Else Statement
- Groovy - Switch Statement
- Groovy - Loops
- Groovy - For Loop
- Groovy - For-in Loop
- Groovy - While Loop
- Groovy - Do While Loop
- Groovy - Break Statement
- Groovy - Continue Statement
Groovy File Handling
- Groovy - File I/O
- Java - Create a File
- Java - Write to File
- Java - Append to File
- Java - Read Files
- Java - Delete Files
- Java - File Properties
- Java - File Existence and Type
- Java - File Size
- Java - File Permissions
- Java - Directories
- Java - Listing Directories
- Java - Filtering Files/Directories
- Java - Deleting Directories
- Java - Renaming Files/Directories
Groovy Error & Exceptions
- Groovy - Exception Handling
- Groovy - try-catch Block
- Groovy - try-with-resources
- Groovy - Multi-catch Block
- Groovy - Nested try Block
- Groovy - Finally Block
- Groovy - throw Exception
- Groovy - Exception Propagation
- Groovy - Built-in Exceptions
- Groovy - Custom Exception
Groovy Multithreading
- groovy - Multithreading
- groovy - Thread Life Cycle
- groovy - Creating a Thread
- groovy - Starting a Thread
- groovy - Joining Threads
- groovy - Naming Thread
- groovy - Thread Scheduler
- groovy - Thread Pools
- groovy - Main Thread
- groovy - Thread Priority
- groovy - Daemon Threads
- groovy - Shutdown Hook
Groovy Synchronization
- groovy - Synchronization
- groovy - Block Synchronization
- groovy - Static Synchronization
- groovy - Inter-thread Communication
- groovy - Thread Deadlock
- groovy - Interrupting a Thread
- groovy - Thread Control
- groovy - Reentrant Monitor
- Groovy - Methods
- Groovy - Methods
- Groovy - Optional parenthesis
- Groovy - Named Arguments
- Groovy - Closures as Arguments
- Groovy - Method Overloading
- Groovy - Method Scope and Visibility
- Groovy - isCase Method
- Groovy - Implicit Return
- Groovy - Variable Arguments
- Groovy - Regular Expressions
- Groovy - Regular Expressions
- Groovy - Defining Regular Expressions
- Groovy - Matcher Object
- Groovy - Regex Tasks
- Groovy - XML
- Groovy - XML
- Groovy - Parsing XML
- Groovy - Creating XML
- Groovy - Modifying XML
- Groovy - Querying XML
- Groovy - Simplified Notation
- Groovy - Closure based Querying
- Groovy - Closure based Creation
- Groovy - JSON
- Groovy - JSON
- Groovy - Parsing JSON
- Groovy - Creating JSON using JsonOutput
- Groovy - Creating JSON using JsonBuilder
- Groovy - Modifying JSON
- Groovy - Error Handling
- Groovy - Handling JSON Arrays
- Groovy - JSON Array Operations
- Groovy - JSON Objects
- Groovy - JSON Object Operations
- Groovy - Generics
- Groovy - Generics
- Groovy - Declaring Generic Types
- Groovy - Bound Type Parameters
- Groovy - Wild Cards
- Groovy - Miscellaneous
- Groovy - Object Oriented
- Groovy - Closures
- Groovy - Annotations
- Groovy - JMX
- Groovy - DSLS
- Groovy - Database
- Groovy - Builders
- Groovy - Command Line
- Groovy - Unit Testing
- Groovy - Template Engines
- Groovy - Meta Object Programming
- Groovy Useful Resources
- Groovy - Quick Guide
- Groovy - Useful Resources
- Groovy - Discussion
Groovy - Thread Life Cycle
Life Cycle of a Thread
The life cycle of a thread in Groovy refers to the various states of a thread goes through. For example, a thread is born, started, runs, and then dies. Thread class defines the life cycle and various states of a thread.
Flow Chart of Thread Life Cycle
The following diagram shows the complete life cycle of a thread.

States of a Thread Life Cycle
Following are the stages of the life cycle −
New − A new thread begins its life cycle in the new state. It remains in this state until the program starts the thread. It is also referred to as a born thread.
Runnable − After a newly born thread is started, the thread becomes runnable. A thread in this state is considered to be executing its task.
Waiting − Sometimes, a thread transitions to the waiting state while the thread waits for another thread to perform a task. A thread transitions back to the runnable state only when another thread signals the waiting thread to continue executing.
Timed Waiting − A runnable thread can enter the timed waiting state for a specified interval of time. A thread in this state transitions back to the runnable state when that time interval expires or when the event it is waiting for occurs.
Terminated (Dead) − A runnable thread enters the terminated state when it completes its task or otherwise terminates.
Example - Demonstrating Thread States
In this example, we're creating two threads by extending the Thread class. We're printing each state of the thread. When a thread object is created, its state is NEW; when start() method is called, state is START; when run() method is called, state is RUNNING; When a thread finished the processing the run() method, it went to DEAD state.
Example.groovy
class Example { static void main(String[] args) { ThreadDemo thread1 = new ThreadDemo( "Thread-1"); ThreadDemo thread2 = new ThreadDemo( "Thread-2"); thread1.start(); thread2.start(); } } class ThreadDemo extends Thread { private Thread t; private String threadName; ThreadDemo( String name) { threadName = name; System.out.println("Thread: " + threadName + ", " + "State: New"); } void run() { println("Thread: " + threadName + ", " + "State: Running"); for(int i = 4; i > 0; i--) { println("Thread: " + threadName + ", " + i); } println("Thread: " + threadName + ", " + "State: Dead"); } void start () { println("Thread: " + threadName + ", " + "State: Start"); if (t == null) { t = new Thread (this, threadName); t.start (); } } }
Output
The above program produces the following output −
Thread: Thread-1, State: New Thread: Thread-2, State: New Thread: Thread-1, State: Start Thread: Thread-2, State: Start Thread: Thread-1, State: Running Thread: Thread-2, State: Running Thread: Thread-2, 4 Thread: Thread-2, 3 Thread: Thread-2, 2 Thread: Thread-2, 1 Thread: Thread-2, State: Dead Thread: Thread-1, 4 Thread: Thread-1, 3 Thread: Thread-1, 2 Thread: Thread-1, 1 Thread: Thread-1, State: Dead
Example - Checking states of Thread created using Thread Class
In this example, we're using sleep() method to introduce some delay in processing and to show case the parallel processing using threads. We're creating two threads by extending the Thread class. We're printing each state of the thread. When a thread object is created, its state is NEW; when start() method is called, state is START; when run() method is called, state is RUNNING; in case sleep() is called, then thread goes to WAITING state; When a thread finished the processing the run() method, it went to DEAD state.
Example.groovy
class Example { static void main(String[] args) { ThreadDemo thread1 = new ThreadDemo( "Thread-1"); ThreadDemo thread2 = new ThreadDemo( "Thread-2"); thread1.start(); thread2.start(); } } class ThreadDemo extends Thread { private Thread t; private String threadName; ThreadDemo( String name) { threadName = name; System.out.println("Thread: " + threadName + ", " + "State: New"); } void run() { println("Thread: " + threadName + ", " + "State: Running"); try { for(int i = 4; i > 0; i--) { println("Thread: " + threadName + ", " + i); // Let the thread sleep for a while. println("Thread: " + threadName + ", " + "State: Waiting"); Thread.sleep(50); } } catch (InterruptedException e) { println("Thread " + threadName + " interrupted."); } println("Thread: " + threadName + ", " + "State: Dead"); } void start () { println("Thread: " + threadName + ", " + "State: Start"); if (t == null) { t = new Thread (this, threadName); t.start (); } } }
Output
The above program produces the following output −
Thread: Thread-1, State: New Thread: Thread-2, State: New Thread: Thread-1, State: Start Thread: Thread-2, State: Start Thread: Thread-1, State: Running Thread: Thread-1, 4 Thread: Thread-1, State: Waiting Thread: Thread-2, State: Running Thread: Thread-2, 4 Thread: Thread-2, State: Waiting Thread: Thread-1, 3 Thread: Thread-2, 3 Thread: Thread-2, State: Waiting Thread: Thread-1, State: Waiting Thread: Thread-2, 2 Thread: Thread-1, 2 Thread: Thread-1, State: Waiting Thread: Thread-2, State: Waiting Thread: Thread-2, 1 Thread: Thread-2, State: Waiting Thread: Thread-1, 1 Thread: Thread-1, State: Waiting Thread: Thread-2, State: Dead Thread: Thread-1, State: Dead
Example - Checking states of Thread created using Runnable Interface
In this example, we're creating two threads by implementing the Runnable class. We're printing each state of the thread. When a thread object is created, its state is NEW; when start() method is called, state is START; when run() method is called, state is RUNNING; in case sleep() is called, then thread goes to WAITING state; When a thread finished the processing the run() method, it went to DEAD state.
Example.groovy
class Example { static void main(String[] args) { ThreadDemo thread1 = new ThreadDemo( "Thread-1"); ThreadDemo thread2 = new ThreadDemo( "Thread-2"); thread1.start(); thread2.start(); } } class ThreadDemo implements Runnable { private Thread t; private String threadName; ThreadDemo( String name) { threadName = name; println("Thread: " + threadName + ", " + "State: New"); } void run() { println("Thread: " + threadName + ", " + "State: Running"); try { for(int i = 4; i > 0; i--) { println("Thread: " + threadName + ", " + i); // Let the thread sleep for a while. println("Thread: " + threadName + ", " + "State: Waiting"); Thread.sleep(50); } } catch (InterruptedException e) { System.out.println("Thread " + threadName + " interrupted."); } println("Thread: " + threadName + ", " + "State: Dead"); } void start () { println("Thread: " + threadName + ", " + "State: Start"); if (t == null) { t = new Thread (this, threadName); t.start (); } } }
Output
Thread: Thread-1, State: New Thread: Thread-2, State: New Thread: Thread-1, State: Start Thread: Thread-2, State: Start Thread: Thread-1, State: Running Thread: Thread-1, 4 Thread: Thread-1, State: Waiting Thread: Thread-2, State: Running Thread: Thread-2, 4 Thread: Thread-2, State: Waiting Thread: Thread-1, 3 Thread: Thread-2, 3 Thread: Thread-2, State: Waiting Thread: Thread-1, State: Waiting Thread: Thread-2, 2 Thread: Thread-1, 2 Thread: Thread-1, State: Waiting Thread: Thread-2, State: Waiting Thread: Thread-2, 1 Thread: Thread-2, State: Waiting Thread: Thread-1, 1 Thread: Thread-1, State: Waiting Thread: Thread-2, State: Dead Thread: Thread-1, State: Dead