
- 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 - Main Thread
Main Thread
Whenever we run a Groovy program, main thread is created automatically. This thread is responsible for execution of groovy program. Groovy runtime searches for main method to execute and create a main thread based on it. If we're creating multiple threads then all child threads will be spawned from main thread. This main thread is the first thread to be created and is generally the last thread and it is used to perform shut down tasks.
How to Control Main Thread?
The main thread is created by the JVM automatically when a program starts. But you can control a Main thread by using different Thread methods and techniques.
The following are some of the methods for controlling the Main thread.
sleep() Method
join() Method
interrupt() Method
Example - Printing Groovy Main Thread
In this example, we're showing a simple one thread program where we're not declaring any thread and checking the thread name in the program execution.
Example.groovy
class Example { void printName() { println("Thread Name: " + Thread.currentThread().getName()); println("Thread Priority: " +Thread.currentThread().getPriority()); } static void main(String[] args) { Example thread = new Example(); thread.printName(); } }
Output
The above program produces the following output −
Thread Name: main Thread Priority: 5
Example - Showcasing thread states
In this example, we've created a ThreadDemo class which extends Thread class. We're not passing any name to the Thread and it will print the default names assigned to the threads by the system. In main method, we've created two threads. In output, you can check, current thread name is printed as main while threads are created using constructor() method call.
Example.groovy
class Example { static void main(String[] args) { ThreadDemo thread1 = new ThreadDemo(); ThreadDemo thread2 = new ThreadDemo(); thread1.start(); thread2.start(); } } class ThreadDemo extends Thread { ThreadDemo( ) { println("Thread: " + Thread.currentThread().getName() + ", " + "State: New"); } void run() { println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running"); for(int i = 4; i > 0; i--) { println("Thread: " + Thread.currentThread().getName() + ", " + i); } println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead"); } void start () { println("Thread: " + Thread.currentThread().getName() + ", " + "State: Start"); super.start(); } }
Output
The above program produces the following output −
Thread: main, State: New Thread: main, State: New Thread: main, State: Start Thread: main, State: Start Thread: Thread-0, State: Running Thread: Thread-0, 4 Thread: Thread-0, 3 Thread: Thread-1, State: Running Thread: Thread-1, 4 Thread: Thread-0, 2 Thread: Thread-1, 3 Thread: Thread-0, 1 Thread: Thread-1, 2 Thread: Thread-0, State: Dead Thread: Thread-1, 1 Thread: Thread-1, State: Dead
Example - Checking subthreads
In this example, we've created a ThreadDemo class which extends Thread class. We're not passing any name to the Thread and it will print the default names assigned to the threads by the system. In main method, we've created two threads. In output, you can check, current thread name is printed as main while threads are created using constructor() method call. In the end of main method, we're printing the state of main thread.
Example.groovy
class TestThread { static void main(String[] args) { ThreadDemo thread1 = new ThreadDemo(); ThreadDemo thread2 = new ThreadDemo(); thread1.start(); thread2.start(); println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead"); } } class ThreadDemo extends Thread { ThreadDemo( ) { println("Thread: " + Thread.currentThread().getName() + ", " + "State: New"); } void run() { println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running"); for(int i = 4; i > 0; i--) { println("Thread: " + Thread.currentThread().getName() + ", " + i); } println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead"); } void start () { println("Thread: " + Thread.currentThread().getName() + ", " + "State: Start"); super.start(); } }
Output
The above program produces the following output −
Thread: main, State: New Thread: main, State: New Thread: main, State: Start Thread: main, State: Start Thread: Thread-0, State: Running Thread: main, State: Dead Thread: Thread-1, State: Running Thread: Thread-0, 4 Thread: Thread-1, 4 Thread: Thread-1, 3 Thread: Thread-1, 2 Thread: Thread-1, 1 Thread: Thread-1, State: Dead Thread: Thread-0, 3 Thread: Thread-0, 2 Thread: Thread-0, 1 Thread: Thread-0, State: Dead
In this output, you can check that main thread was finished in earlier stages but threads were still running and finished their execution.