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
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();
• A may not extend other
classes.
• B may extend another class.
• Decouples task submission
from thread scheduling, etc.
Threads in Java
2
Synchronizing threads
• Having threads in a programming
language is a nice feature, but threads
have 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
3
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
4
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
5
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
6
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
7
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
8
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()
Threads in Java
9
Wait “Code pattern”
synchronized (obj) {
while (conditionDoesNotHold) {
obj.wait();
}
// perform action appropriate to the condition
}
• http://java.sun.com/books/tutorial/essential/threads/waitA
ndNotify.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
10
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
11
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
12
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
13
Thread pool implementations
• The class Executors has 2 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
14
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
15
Threads in Java Swing
• Java Swing has a single main thread
– Event-handling
– Painting visual components
– Called the event-dispatching-thread (EDT)
– Your “jobs” should be executed by the EDT
• To avoid deadlock
Threads in Java
16
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.
• Java 1.3
– Calls java.awt.EventQueue.invokeLater(Runnable r)
– SwingUtilities.invokeAndWait(Runnable r)
• Returns when r has finished running
– Synchronous
Threads in Java
17
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();
}
}
EventQueue.invokeLater(r);
}
•
This is (almost) the code NetBeans 4.1 generates when you make a new
JFrame class!
Threads in Java
18
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
Threads in Java
19
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
20
More references
• Doug Lea Concurrent
Programming in Java 2nd
edition, Addison Wesley
2000
– Probably the most
important book on
concurrent programming in
Java – by the author who
wrote java.util.concurrent
• Oaks & Wong Java
Threads, O’Reilly 2004
• Niemeyer & Knudsen
Learning Java, 3rd edition,
O’Reilly 2005
– 9. Threads, page 249-297
Threads in Java
21