Chapter Four Java Threads
Chapter Four Java Threads
Chapter Four Java Threads
Java Threads
Contents
1. What is a thread ?
4. interrupt a thread
5. thread synchronization
6. other issues
What is a thread ?
A sequential (or single-threaded) program is one that, when
executed, has only one single flow of control.
i.e., at any time instant, there is at most only one instruction (or statement or
execution point) that is being executed in the program.
A multi-threaded program is one that can have multiple flows of
control when executed.
At some time instance, there may exist multiple instructions or execution
points) that are being executed in the program
Ex: in a Web browser we may do the following tasks at the same time:
1. scroll a page,
2. download an applet or image,
3. play sound,
4 print a page.
A thread is a single sequential flow of control within a program.
single-threaded vs multithreaded programs
{ A();
{ A(); A1(); A2(); A3(); newThreads {
B1(); B2(); } { A1(); A2(); A3() };
{B1(); B2() }
}
}
Thread ecology in a java program
started by B thread
lifetime of C thread
2. Define and launch a java thread
Each Java Run time thread is encapsulated in a java.lang.Thread instance.
2. Override the default Thread method run(), which is the entry point of the thread, like the
main(String[]) method in a java program.
Define a thread
// Example:
public class Print2Console extends Thread {
public void run() { // run() is to a thread what main() is to a java program
for (int b = -128; b < 128; b++) out.println(b); }
… // additional methods, fields …
}
Implement the Runnable interface if you need a parent class:
// by extending JTextArea we can reuse all existing code of JTextArea
public class Print2GUI extend JTextArea implement Runnable {
public void run() {
for (int b = -128; b < 128; b++) append( Integer.toString(b) + “\n” ); }
}
How to launch a thread
public class Thread { .. // enum in 1.5 is a special class for finite type.
public static enum State { //use Thread.State for referring to this nested class
// wait(), join()
}…
}
The life cycle of a Java thread
runnable
get the lock blocked/waiting
start() resume()
new Thread(…)
not-running thread t terminates
(ready) sleep done
o.notify(), o.notifyAll()
interrupt()
(set bit) interrupt()
yield(), or
preempty scheduled
by OS (throw exception)
by OS
o.wait()
sleep(…)
running t.join()
stop(),
terminated suspend()
run() exits
blocked by lock
normally or
abnormally
State transition methods for Thread
public synchronized native void start() {
start a thread by calling its run() method … Note: When we call
It is illegal to start a thread more than once } t.join(), we in fact use
current thread's time to
public final void join( [long ms [, int ns]]); execute code of t thread
Let current thread wait for receiver thread to die for at most ms+ns time
static void yield() // callable by current thread only
Causes the currently executing thread object to temporarily pause and allow other
threads to execute.
public final void resume(); // deprecated
public final void suspend();// deprecatedmay lead to deadlock
public final void stop(); // deprecated lead to inconsistency
// state checking
public boolean isAlive() ; // true if runnable or blocked
4. interrupting threads
A blocking/waiting call (sleep(),wait() or join()) to a thread t can be terminated by an
InterruptedException thrown by invoking t.interrupt().
this provides an alternative way to leave the blocked state.
however, the control flow is different from the normal case.
Ex: public void run() {
try { … while (more work to do) { // Normal sleep() exit continue here
do some work;
sleep( … ); // give another thread a chance to work
}
}
catch (InterruptedException e) { // if waked-up by interrupt() then continue here
… // thread interrupted during sleep or wait }
}
Note: the interrupt() method will not throw an InterruptedException if the thread
is not blocked/waiting. In such case the thread needs to call the static
interrupted() method to find out if it was recently interrupted. So we should
rewrite the while loop by
synchronized(e) { B4 }
e.m1() {B1}
e.wait() // cannot continue and
don't want return
Monitor controlled
by an object e
e.m2() {B2} With critical Waiting list
section for Threads
B1 U B2…U B5
e.m3(){B3} e.notify|notifyAll()
// notified by current monitor
executor if it changes state
synchronized(e) { B5 }
• Note since a section of code may belong to multiple monitors, it is possible that
two threads reside at the same code region belonging to two different
monitors..
Producer/Consumer Problem
Two threads: producer and consumer, one monitor: CubbyHole
The Producer :
generates a pair of integers between 0 and 9 (inclusive), stores it in a
CubbyHole object, and prints the sum of each generated pair.
sleeps for a random amount of time between 0 and 100 milliseconds before
repeating the number generating cycle:
The Consumer,
consumes all pairs of integers from the CubbyHole as quickly as they
become available.
Producer.java
public class Producer extends Thread {
private CubbyHole cubbyhole; private int id;
public Producer(CubbyHole c, int id) {
cubbyhole = c; this.id = id; }
public void run() {
for (int i = 0; i < 10; i++)
for(int j =0; j < 10; j++ ) {
cubbyhole.put(i, j);
System.out.println("Producer #" + this.id + " put: ("+i +","+j + ").");
try { sleep((int)(Math.random() * 100)); }
catch (InterruptedException e) { }
};
}
}
Consumer.java
public class Consumer extends Thread {
private CubbyHole cubbyhole;
private int id;
currentGroup.enumerate(listOfThreads);
for (int i = 0; i < numThreads; i++)
System.out.println("Thread #" + i + " = " +
listOfThreads[i].getName());
}
}
Methods that Operate on the ThreadGroup
getMaxPriority(), setMaxPriority(int)
isDaemon(), setDaemon(boolean)
A Daemon thread group is one that destroys itself when its last thread/group
is destroyed.
getName() // name of the thread
getParent() and parentOf(ThreadGroup) // boolean
toString()
activeCount(), activeGroupCount()
// # of active descendent threads, and groups
System.in.read();
}catch ( Exception e) { }
a.interrupt();
} }
Note: You may change the content of Main if it does not meet your need.