jan. 20041 java threads yangjun chen dept. business computing university of winnipeg

39
Jan. 2004 1 Java Threads Yangjun Chen Dept. Business Computing University of Winnipeg

Post on 21-Dec-2015

218 views

Category:

Documents


0 download

TRANSCRIPT

Jan. 2004 1

Java Threads

Yangjun Chen

Dept. Business ComputingUniversity of Winnipeg

Jan. 2004 2

Outline: Multithreading

• Threads and Multithreading• Thread Class• Static Methods• Instance Methods• Creating a Thread

- extending the Thread class- implementing the Runnable interface

• Synchronization in Threads• Thread Communication• Deadlock

Jan. 2004 3

Threads

• A thread is a single stream of execution within a process.

• A process is a program executing in its own address space.

• You have been using threads all along.• The main control or execution of all the programs

up untilnow were controlled by a single thread.

• What we want to look at is mutlithreading or having multiple threads executing within the same program.

Jan. 2004 4

Threads

• You might be more familiar with the term multitasking.

Multitasking:- having more than one program working at what seems to

be at the same time.- The OS assigns the CPU to the different programs in a

manner to give the impression of concurrency.- There are two types of multitasking - preemptive and

cooperative multitasking.• Multithreading:

- extends the idea of multitasking by allowing individual programs to have what appears to be multiple tasks.

- Each task within the program is called a thread.

Jan. 2004 5

Threads

• Java has multithreading built into it.• Java provides a Thread class for handling threads.• There are two ways to Thread objects

- creating objects from subclasses of the Java Thread class- implementing the Runnable interface for an object

ThreadThread

ThreadSubclassThreadSubclass

class ThreadX extends Thread {class ThreadX extends Thread {public void run() {public void run() {//logic for the thread//logic for the thread}}

}}

ThreadX tx = new ThreadX();ThreadX tx = new ThreadX();tx.start();tx.start();

Jan. 2004 6

RunnableRunnable

SomeSubclassSomeSubclass

class RunnableY implements Runnable {class RunnableY implements Runnable {public void run() {public void run() {//logic for the thread//logic for the thread}}

}}

RunnableY ry = new RunnableY();RunnableY ry = new RunnableY();Thread ty = new Thread(ry);Thread ty = new Thread(ry);ty.start();ty.start();

Threads

implementsimplements

Jan. 2004 7

Thread Class

• The Thread class is part of the java.lang package.• Using an object of this class, the corresponding

thread canbe stopped, paused, and resumed.

• There are many constructors and methods for this class, wewill look at a few of them:- Thread( ) - no argument- Thread( String n) - creates a new Thread with the name

n.- Thread( Runnable target) - creates a new Thread object.- Thread( Threadgroup group, Runnable target)

This creates a new Thread object in the specified Threadgroup.

Jan. 2004 8

Methods in Thread Class

static methods:static methods:activeCount();activeCount();currentThread();currentThread();sleep();sleep();yield();yield();

instance methods:instance methods:getPriority();getPriority();setPriority();setPriority();start();start();stop();stop();run();run();isAtive();isAtive();suspend();suspend();resume();resume();join();join();

Jan. 2004 9

Static Methods of Thread Class

• static int activeCount() - returns the number of currentlyactive threads. For example:- num_ threads = Thread. activeCount();

• static Thread currentThread() - returns the object corresponding to the currently executing thread (self reference)- Thread myself = Thread. currentThread();

• static void sleep( long millis) throws InterruptedException -this causes the current thread to sleep for the

specifiedamount of time. Other threads will run at this

time.

Jan. 2004 10

Static Methods of Thread Class

• You can also specify the number of nanoseconds as well- static void sleep(long millis, int nano);

• static void yield() - causes the thread to yield the processorto any other waiting threads - Java does not

guaranteepreemption, you should use this to ensure

fairness.

Jan. 2004 11

Instance Methods of Thread Class

• These methods control the thread represented by a Threadobject

• int getPriority() - returns the threads priority - a valuebetween Thread. MIN_ PRIORITY andThread. MAX_ PRIORITY

• void setPriority( int newpri) - this sets the threads priority- high priority threads will preempt lower ones when they become ready to run.

Thread myself = Thread. currentThread();myself. setPriority( Thread. MAX_ PRIORITY);

Jan. 2004 12

Instance Methods of Thread Class

• A ThreadGroup may restrict the maximum priority of all itsmember threads - therefore the setPriority

method may notsucceed.

• void start() throws IllegalThreadStateException - actuallystarts the thread - the thread starts and enters

the run() method• void stop() throws SecurityException - stops the

thread• void run() - this method is called when the thread

is started.• This is what the thread will execute while it is

alive.• boolean isAlive() - returns a value indicating

whether thethread is currently alive - i.e. Started more

recently and has not yet been died.

Jan. 2004 13

Instance Methods of Thread Class

• void suspend() - suspends the threads execution• void resume() - resumes the execution of the

thread• void join() – causes the caller to wait until the

thread dies

Jan. 2004 14

Creating Threads

• Creating a thread by subclassing the Thread class• This method will allow only five thread to be

started in anobject.

public class SimpleThread extends Thread {private int countDown = 3;private static int threadCount = 0;private int threadNumber = ++threadCount;public SimpleThread( ) { System.out.println(“Making ” + threadNumber++);}

Jan. 2004 15

Creating Threads

public void run( ) { while(true) {

System.out.println(“Thread ” + threadNumber +“(“ + countDown + “)”);if (--countDown == 0) return;

} }

public static void main(String[] args) { for (int i = 0; i < 5; i++)

new SimpleThread().start(); System.out.println(“All Threads Started”);

}}

Jan. 2004 16

Creating Threads

• One possible output of ‘SimpleThread’:

Making 1 All Threads StartedMaking 2 Thread 2(3)Making 3 Thread 2(2)Making 4 Thread 6(3)Making 5 Thread 3(2)Thread 3(3) Thread 2(1)Thread 4(3) Thread 6(2)Thread 4(2) Thread 6(1)Thread 4(1) Thread 3(1)Thread 5(3)Thread 5(2)Thread 5(1)

Jan. 2004 17

Creating Threads

• One possible output of ‘SimpleThread’:

TTmainmain TT22 TT33 TT44 TT55 TT66

Making 1Making 1 Making 2Making 2 Making 3Making 3 Making 4Making 4 Making 5Making 5

3(3)3(3)

3(2)3(2)

3(1)3(1)

4(3)4(3)

4(2)4(2)

4(1)4(1)

6(3)6(3)

6(2)6(2)

6(1)6(1)

5(3)5(3)

5(2)5(2)

5(1)5(1)

2(3)2(3)

2(2)2(2)

2(1)2(1)

All Thread startedAll Thread started

Jan. 2004 18

Synchronization in Threads• Synchronization is a mechanism to control the the

execution of different threads so that:- when multiple threads access a shared variable, proper

execution can be assured.• Java has the synchronized keyword - this can be

used toidentify a segment of code or method that should

beaccessible to just a single thread at a time.

• Before entering a synchronization region, a thread shouldobtain the semaphore associated with that region

- it isalready taken, then the thread blocks (waits) until

thesemaphore is released.

Jan. 2004 19

Synchronization in Threadsclass Account {

private int balance = 0;synchronized void deposit(int amount)}

balance += amount;}}

class Customer extends Thread {Account account;Customer(Account account) {

this.account = account;}

public void run() {try { for (int i = 0; i < 10000; i++)

{account.deposit(10);}}

Jan. 2004 20

Synchronization in Threadscatch (Exception e) {

e.printStackTrace();}

}}

public class BankDemo {private final static int NUMCUSTOMER = 10;public static void main(String args[]) {

//Create accountAccount account = new Account();//Create and start customer threadsCustomer customer[] = new

Customer[NUMCUSTOMER];for (int i = 0; i < NUMCUSTOMER; i++) {

customer[i] = new Customer(account);customer[i].start();

}

Jan. 2004 21

Synchronization in Threads//Wait for customer threads to completefor (int i = 0; i < NUMCUSTOMER; i++) {

try {customer[i].join();

}catch (InterruptedException e) {

e.printStackTrace();}

}//Display account balanceSystem.out.println(account.getBalance());

}}

Jan. 2004 22

Synchronization in Threads• In Java, any object with one or more synchronized

methodsis a monitor.

• When threads call a synchronized method, only one threadis let in at a time, the others wait in a queue.

• In producer- consumer type applications, consumer threadsmight find that there is not enough elements to

consume• It is the job of the monitor to ensure that the threads that are

waiting for the producer are notified once the elements are

produced.

Jan. 2004 23

Thread Communication• A thread can temporarily release a lock so other

threads can have an opportunity to execute a synchronized method.

• It is because the Object class defined three methods that allow threads to communicate with each other.- void wait() - causes the thread to wait until notified - this

methodcan only be called within a synchronized method.- void wait(long msec) throws InterruptedException- void wait(long msec, int nsec) throws

InterruptedException- void notify() - notifies a randomly selected thread

waiting for a lock on this object - can only be called within a synchronized method.

- void notifyall() - notifies all threads waiting for a lock on this object - can only be called within a synchronized method.

Jan. 2004 24

Thread Communicationclass Producer extends Thread {

Queue queue;Producer (Queue queue) {

this.queue = queue;}

public void run {int i = 0;while(true) {

queue.add(i++);}

}}

Jan. 2004 25

Thread Communicationclass Comsumer extends Thread {

String str;Queue queue;Consumer (String str, Queue queue) {

this.str = str;this.queue = queue;

}

public void run {while(true) {

System.out.println(str + “: ” + queue.remove(););}

}}

Jan. 2004 26

Thread Communicationclass queue {

private final static int SIZE = 10;int array[] = new int[SIZE];int r = 0;int w = 0;int count = 0;synchronized void add(int i) {

//wait while the queue is fullwhile (count == SIZE) {

try {wait()

}catch (InterruptedException ie) {

ie.printStackTrace();System.exit(0);

}}

Jan. 2004 27

Thread Communication//Add data to array and adjust write pointerarray[w++] = i;if (w >= SIZE)

w = 0;//Increment count

++count;//Notify waiting threadsnotifyAll();}synchronized int remove() {

//wait while the queue is emptywhile (count == 0) {

try { wait();}catch (InterruptedException ie) {

ie.printStackTrace();System.exit(0);}}

Jan. 2004 28

Thread Communication//read data from array and adjust read pointerint element = array[r++];if (r >= SIZE)

r = 0;//Decrement count

--count;//Notify waiting threadsnotifyAll(); return element;}}public ProducerConsumer {

public static void main(String args[]) {Queue queue = new Queue();new Producer(queue).start();new Consumer(“ConsumerA”, queue).start();new Consumer(“ConsumerB”, queue).start();new Consumer(“ConsumerC”, queue).start();}}

Jan. 2004 29

Thread Properties

runnablerunnable

blockedblocked

newnew

deaddead

startstart

stopstop

I/OI/Ocompletecomplete

block on I/Oblock on I/O

notifynotify

waitwait

resumresumee

suspendsuspend

donedone

sleepsleep

Jan. 2004 30

Deadlock

• DeadlockDeadlock is an error that can be encountered in multithreads.It occurs when two or more threads wait indefinitely for each other to relinquish locks. - Assume that thread-1 holds a lock on object-1 and waits for a lock on object-2. Thread-2 holds a lock on object-2 and waits for a lock on object-2. - Neither of these threads may proceed. Each waits forever for the other to relinquish the lock it needs.

Jan. 2004 31

Deadlock

T1:T1: AA

a1();a1();

a2();a2();

bb

BB

aa b1();b1();

b2();b2();

T2:T2:

Jan. 2004 32

Deadlock

class A {B b;synchronized void a1() {

System.out.println(“Starting a1”);b.b2();

}

synchronized void a2() {System.out.println(“Starting a2”);

}}

Jan. 2004 33

Deadlock

class B {A a;synchronized void b1() {

System.out.println(“Starting b1”);a.a2();

}

synchronized void b2() {System.out.println(“Starting b2”);

}}

Jan. 2004 34

Deadlock

class Thread1 extends Thread {A a;Thread1(A a) {

this.a = a;}

public void run() {for (int i = 0; i < 100000; i++)

a.a1();}

}

Jan. 2004 35

Deadlock

class Thread2 extends Thread {B b;Thread2(B b) {

this.b = b;}

public void run() {for (int i = 0; i < 100000; i++)

b.b1();}

}

Jan. 2004 36

Deadlock

public class DeadlockDemo {public static void main(String args[]) {

//Create objectsA a = new A();B b = new B();a.b = b;b.a = a;//Create threadsThread1 t1 = new Thread1(a);Thread2 t2 = new Thread2(b);t1.start(); t2.start();}//wait for threads to completetry {t1.join(); t2.join();}catch (Exception e) { e.printStackTrace(); }System.out.println(“Done!”);

}}

Jan. 2004 37

Deadlock

The following is sample output from this application:

Starting a1Starting b2Starting a1Starting b2Starting a1Starting b2Starting a1Starting b2Starting a1Starting b1

Jan. 2004 38

public class GenericServer extends Thread {protected ServerSocket s;protected HashTable routes;public GenericServer( int port) throws IOException {

super(“GenericServer”);s = new ServerSocket( port);routes = new HashTable();

public void run() {try {

while( true) {Socket s2 = s. accept();// other code

}}catch( IOException e) {

e. printStackTrace();}

}

Jan. 2004 39

public static void main( String args[]) throws IOException {if (args. length!= 1)throw new IOException(“ Syntax: GenericServer <port>”);GenericServer server = new GenericServer(Integer. parseInt( args[ 0]));server. start();

} // end of main} // end of class