Hi i will try to give back some of the
knowledge I've learned through the years by reading blogs, so I'm
going to start with a series of articles in which I will explain to you
the java concurrency API, I hope you can learn something from it, as
I did.
PART I - INTRODUCTION
What is a thread?
The term concurrency means tasks
executing simultaneously, java supports concurrency via threads
objects. A thread is a task of execution in a program. The Java
Virtual Machine allows an application to have multiple threads of
execution running concurrently.
There are 2 types of threads in java,
daemon and non-daemon, when the JVM starts up, there is usually a
single non-daemon thread and is the one that calls the main() method
of a program, and the JVM executes until a call to System.exit() has
been made or all threads that are not daemon threads have died.
Making it easier to understand daemon
threads can be called System threads and non-daemon threads can be
called program or user threads, and an applications runs until there
are not program threads, to execute.
There are two ways to create a thread:
- Extending the Thread class and overriding the run().public void run() {.....}}
Implement the Runnable interface
and then create a Thread object and set the Runnable object to it.
public class Calculator implements Runnable {
public void run() {
.....}}
Whether the thread extends Thread class or implements the Runnable interface, either way a Thread Object has to be created to execute the thread. But creating an Object of the Thread class doesn't create a new execution thread, only calling the start() method creates a new execution thread.
- If thread object extends Thread:Calculator calculator = new Calculator (); calculator.start();
- If thread object implements Runnable:Thread thread = new Thread(new Calculator ())thread.start();
Thread states
A thread has the following states:
New: The Thread object has been
created, but start() has not been invoked, at this point is not
consider alive.
Runnable: start() has been
invoked and is eligible to run, but the schedule has not selected it.
Running: The thread is selected
by the scheduler and executes the run().
Waiting/blocked/sleeping: Thread
is alive but NOT ELIGIBLE TO RUN.
Dead: run() has completed.
After calling start() method the jvm
does the following:
- A new thread of execution starts.
- The thread moves from new state to runnable state.
- When the thread gets chance to execute, its run() will execute.
A thread can be started just once, this
means that a call to the start() method can not be done more than
once. If start() is called more than once an
IllegalThreadStateException will rise.
Running multiple threads
A thread can be identified by the
following attributes.
- ID: Unique identifier for each Thread.
- Name: Name of Thread.
- Priority: Threads can have a priority between one and 10, where one is the lowest priority and 10 is the highest one.
- Status: Status of Thread. A Thread can be in one of these five states: new, runnable, blocked, waiting, or terminated.
When multiple threads run
simultaneously each one gets the CPU according to the scheduler.
There
is not guarantee which thread will start or end first. The only
guarantee is that each thread will run to completion.
public class Calculator extends
Thread {
public void run() {
System.out.println(“Thread
running:” + this.getName());
}
}
......
Calculator
first = new Calculator(“First”);
first.start();
Calculator second = new Calculator(“Second ”);
second.start();
......
There is no guarantee that the order of the messages will be:
Thread running: first
Thread running: second
The only guarantee is that both messages will appear in console.
The join() method of the thread class suspends the execution
of the calling thread until the join thread has finished.
...........
Calculator first = new Calculator(“First”);
try {
first.join():
} catch (InterruptedException e) {
e.printStackTrace();
}
Calculator second = new Calculator(“Second ”);
second.start();
...........
This way the console must print the message in the following order:
Thread running: first
Thread running: second
Go to part 2
Good Inroduction !!!
ReplyDeleteHi,
ReplyDeleteMaybe I'm wrong, I have not a well founded Thread knowledge. But as you say in the last paragraf "The join() method of the thread class suspends the execution of the calling thread until until some other thread has finished", what means the calling thread is first no? Therefore it must wait until secof finish?
Hi Marc,
DeleteFirst I'm sorry because I repeated the until word two times. Looking at it again I noticed I didn't explained clearly enough, this is maybe because this is my first post ever but I already change it and let me explain it to you in this way:
When you call the join() on a thread you are saying I'm going to wait for the thread to finish, so for example:
public static void main(String[] args) {
Thread t = new Thread();
....
t.join();
System.out.println("After join");
.....
}
In this code since the main method is run by a Daemon thread, so this thread when it reaches the t.join() sentence waits for the "t" thread to finish, it "joins" to the thread, after the "t" thread finishes the Daemon thread takes back the control and executes the System.out sentence.
I hope this makes it clear to you.
Great tutorial, very concise!
ReplyDelete