Download Threads in Java

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Concurrency
Synchronizing threads, thread
pools, etc.
Threads in Java
1
Benefits of threads
More CPU’s
• Many modern computers has more than
one CPU
– Dual Core
• By dividing the program into more threads
the program can utilize the CPU’s
– The program will run faster
Threads in Java
2
Benefits of threads
• A thread may be waiting for
something to happen
– File to be read
– Incoming network requests
– Sleep()
– Wait()
• While one thread is waiting
other threads should use the
CPU
– The program will run faster
• Figure from
– http://jayford040.blogspot.com/20
09/07/process-concept-operatingsystem.html
Threads in Java
3
Creating threads
Class A extends Thread {
public void run() {
…
}
}
Class B implements Runnable {
public void run() {
…
}
}
A a = new A();
a.start();
B b = new B();
Tread t = new Thread(b);
t.start();
• Class A can not extend other
classes.
• Class B may extend another
class.
• Decouples task submission
from thread scheduling, etc.
Threads in Java
4
Joining treads
• Some methods on the
class Thread
– start()
• Starts the thread
– join()
• waits for the thread to
die
Runnable printerA = new
Printer("Anders", 10);
Thread threadA = new
Thread(printerA);
threadA.start();
// threadA.join();
System.out.println( "Main is
done");
Threads in Java
5
Interrupting threads
• You can interrupt a thread.
• An interrupted thread should stop doing what it is
doing, and do something else.
– Like stop running
• Example
– Interrupting (NetBeans project)
• Threads in the “waiting state” receives an
InterruptedException
– Thrown by sleep(), etc.
• A thread may ask if it has been interrupted
– boolean Thread.interrupted()
– Static method in the Thread class (like sleep(…))
Threads in Java
6
Synchronizing threads
• Having threads in a programming
language is a nice feature, but threads
must to be controlled.
– If you have 2 or more threads with reference
to the same object, the threads might execute
methods on that object simultaneously.
• This must be controlled
Threads in Java
7
Race conditions and critical
sections
• Race condition
– 2 or more threads are reading or writing shared data
and the final result depends on the timing of the
thread scheduling.
– Race conditions are generally a bad thing!
• Critical section
– Part of a program (whole method or just a part of a
method) where race conditions might happen.
– To avoid race conditions
• We want to make sure that at most one thread executes the
critical section at any point in time.
• Threads must be synchronized.
Threads in Java
8
Locks on objects
• Every object has an associated lock.
• At most one thread can have the lock at any
point in time.
• A thread acquire the lock of the object when it
enters a synchronized block (i.e. critical section)
– If another thread holds the lock on the object the
entering thread has to wait (hopefully not forever).
• A thread releases the lock when it leaves the
synchronized block.
Threads in Java
9
Synchronization: Java syntax
public synchronized method() {
// critical section
}
• Often the whole method is a
critical section.
• You synchronize on the current
object, i.e. this.
public method() {
…
synchronized(obj) {
// critical section
}
…
}
• Sometimes only part of a
method is a critical section.
• You synchronize on the object
mentioned.
• Less synchronization, means
more concurrency.
Threads in Java
10
Reentrant locks
• If a thread has a the lock on some object,
and then calls another synchronized
method,
– The thread does not have to wait for itself to
release the lock
– The lock is not released when it leaves the
latter method
• Since the thread had the lock before entering the
method.
Threads in Java
11
wait
• Entering a synchronized method a thread might
realize that it is not in a state to fulfill its task –
and it cannot simply return from the method
because the return value is not “ready”.
• The thread must wait
– Call wait()
• Method from class Object
• wait() really means this.wait()
• Releases the lock on the object
– Another thread can run, hopefully “fixing the state”
• Waits for another thread to call a notify() or notifyAll()
Threads in Java
12
notify() and notifyAll()
• obj.notify()
– Wakes up a single thread waiting on obj.
• The thread is randomly chosen
• obj.notifyAll()
– Wakes up all threads waiting on obj.
– Generally you want to use notifyAll() not
notify()
• Example
– ThreadBank, package waitingacccount
Threads in Java
13
Wait “Code pattern”
synchronized (obj) {
while (conditionDoesNotHold) {
obj.wait();
}
// perform action appropriate to the condition
}
• http://download.oracle.com/javase/tutorial/essential/conc
urrency/guardmeth.html
• wait() should always be called in a loop, since
obj.notifyAll() wakes up all thread waiting for the object.
• Only the first (quickest) should execute the synchronized
block. Other thread go back to wait.
Threads in Java
14
3 versions of wait
• wait()
– Waits indefinitely for notification
• hopefully not forever
• wait(long timeout)
– Waits for notification or until timeout milliseconds has
elapsed
• wait(long timeout, int nanos)
– Waits for notification or until timeout milliseconds +
nanos nanoseconds have elapsed.
Threads in Java
15
Thread pools
• Creating a new thread object takes relatively
much time
• Idea: Recycle thread objects.
–
–
–
–
Keep threads in a thread pool.
Request thread from pool.
Put used threads back into the pool.
java.util.concurrent offers more implementations of
this idea
• New in Java 5.0
• Example
– http://java.sun.com/j2se/1.5.0/docs/api/java/util/concu
rrent/ExecutorService.html
Threads in Java
16
Thread pool implementations
• The class Executors has static methods to
create thread pools
– ExecutorService newFixedThreadPool(int
nThreads)
• Pool of a fixed size
– ExecutorService newCachedThreadPool()
• Creates new threads as needed.
• New threads are added to the pool, and recycled.
• ExecutorService has an execute method
– void execute(Runnable command)
Threads in Java
17
Callable vs. runnable interface
• Callable has 1
method
• Runnable has 1
method
– V call() throws
Exception
– Can return a value
– Can throw exceptions
• Can be executed
using an Executor
object
– void run()
– No return value
– No exceptions
• Can be executed
using an Executor
object
Threads in Java
18
Collection framework
• Vector and HashTable
– Old collections
• From before the collections framework
– Methods are synchronized
• Synchronized wrappers
– Modern collections like List, Set, and Map
• From the collections framework
– Methods are not synchronized
– Methods can be synchronized using the synchronized wrappers
• Static methods in class Collections
–
–
–
–
Collection synchronizedCollection( Collection c )
List synchronizedList( List l )
Set synchronizedSet( Set s )
Map synchronizedMap( Map m )
Threads in Java
19
Threads in Java Swing
• Java Swing has a single thread
– Called the event-dispatching-thread (EDT)
– Event-handling
– Painting visual components
– Creating and showing the GUI should be
executed by the EDT
• To avoid deadlock
Threads in Java
20
Methods in javax.swing.Utilities
• The class javax.swing.Utilities has 2
interesting static methods
– SwingUtilities.invokeLater(Runnable r)
• Returns as soon as r is handed over to the EDT.
– Asynchronous
• Used for updating visual components.
– SwingUtilities.invokeAndWait(Runnable r)
• Returns when r has finished running
– Synchronous
Threads in Java
21
Starting a Swing based application
class MyFrame extends JFrame {
…
}
public static void main(String [] args) {
Runnable r = new Runnable() { // anonymous inner class
public void run() {
new MyFrame().setVisible();
}
}
SwingUtilities.invokeLater(r);
}
•
This is (almost) the code NetBeans generates when you make a new
JFrame class!
Threads in Java
22
Use threads to improve
performance
• Move time-consuming tasks out of the
main thread
– GUI responds faster
– Create special threads for the time-consuming
tasks.
– Examples:
• Reading data from files, network connections,
databases, etc.
• Long running computations
– Example longRunningThread calling run() vs. start()
Threads in Java
23
References
• Sun Microsystems The Java Tutorial, Threads
– http://java.sun.com/docs/books/tutorial/essential/threads/index.ht
ml
• Sun Microsystems Java 2 Platform Standard
Edition 5.0 API Specification: java.util.concurrent
– http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/packa
ge-summary.html
Threads in Java
24
More references
• Brian Goetz et al Java
Concurrency in Practice,
Addison Wesley 2006
http://javaconcurrencyinpractice.com
• Doug Lea Concurrent
Programming in Java 2nd
edition, Addison Wesley 2000
• Oaks & Wong Java Threads,
O’Reilly 2004
• Niemeyer & Knudsen
Learning Java, 3rd edition,
O’Reilly 2005
– 9. Threads, page 249-297
Threads in Java
25