ThreadsMultiprocessingMultithreadingWhy multithreading?Slide 5SleepingStates of a ThreadState transitionsTwo ways of creating ThreadsExtending ThreadImplementing RunnableStarting a ThreadExtending Thread: summaryImplementing Runnable: summaryThings a Thread can doAnimation requires two ThreadsHow to do animationsThings a Thread should NOT doHow to control another ThreadA problemTools for a solutionThe EndThreadsMultiprocessing•Modern operating systems are multiprocessing•Appear to do more than one thing at a time•Three general approaches:–Cooperative multiprocessing–Preemptive multiprocessing–Really having multiple processorsMultithreading•Multithreading programs appear to do more than one thing at a time•Same ideas as multiprocessing, but within a single program•More efficient than multiprocessing•Java tries to hide the underlying multiprocessing implementationWhy multithreading?•Allows you to do more than one thing at once–Play music on your computer’s CD player,–Download several files in the background,–while you are writing a letter•Multithreading is essential for animation–One thread does the animation–Another thread responds to user inputsThreads•A Thread is a single flow of control–When you step through a program, you are following a Thread•Your previous programs all had one Thread•A Thread is an Object you can create and controlSleeping•Every program uses at least one Thread•Thread.sleep(int milliseconds);•try { Thread.sleep(1000); }catch (InterruptedException e) { }•sleep only works for the current ThreadStates of a Thread•A Thread can be in one of four states:–Ready: all set to run–Running: actually doing something–Waiting, or blocke d: needs something–Dead: will never do anything again•State names vary across textbooks•You have some control, but the Java scheduler has moreState transitionsreadywaitingrunning deadstartTwo ways of creating Threads•You can extend the Thread class:–class Animation extends Thread {…}–Limiting, since you can only extend one class•Or you can implement the Runnable interface:–class Animation implements Runnable {…}–requires public void run( )•I recommend the second for most programs•Applets must use the second method (since they must extend Applet)Extending Thread•class Animation extends Thread { public void run( ) { code for this thread } Anything else you want in this class}–The run() method overrides the one inherited from Thread•Animation anim = new Animation( );–A newly created Thread is in the Ready state•To start the anim Thread running, call anim.start( );•start( ) is a request to the scheduler to run the Thread --it may not happen right away•The Thread should eventually enter the Running stateImplementing Runnable•class Animation implements Runnable { public void run( ) { code for this thread } Anything else you want in this class}•The Runnable interface requires run( )–This is the “main” method of your new Thread •Animation anim = new Animation( ); •Thread myThread = new Thread(anim);•To start the Thread running, call myThread.start( );–You do not write the start() method—it’s provided by Java•As always, start( ) is a request to the scheduler to run the Thread--it may not happen right awayStarting a Thread•Every Thread has a start( ) method•Do not write or override start( ) •You call start( ) to request a Thread to run•The scheduler then (eventually) calls run( )•You must supply public void run( )–This is where you put the code that the Thread is going to runExtending Thread: summaryclass Animation extends Thread { public void run( ) { while (okToRun) { ... } }}Animation anim = new Animation( );anim.start( );Implementing Runnable: summaryclass Animation extends Applet implements Runnable { public void run( ) { while (okToRun) { ... } }}Animation anim = new Animation( );Thread myThread = new Thread(anim);myThread.start( );Things a Thread can do•Commonly used:–Thread.sleep(milliseconds)•Rarely used:–yield( )–Thread me = currentThread( );–int myPriority = me.getPriority( );–me.setPriority(NORM_PRIORITY);–if (otherThread.isAlive( )) { … }–join(otherThread);Animation requires two Threads•Suppose you set up Buttons and attach Listeners to those buttons...•…then your code goes into a loop doing the animation…•…who’s listening?–Not this code; it’s busy doing the animation•Whenever you create a GUI, Java automatically creates a second thread to handle all the routine stuff (Buttons, text fields, etc.)•If you do drawing (lines, circles, text not in a text field, etc.), it is your responsibility to tell Java when anything is changed and needs to be redrawnHow to do animations•Create your buttons and attach listeners in your first (original) Thread–Java automatically creates another Thread to handle your listeners•You should explicitly create another Thread to run the animation•start() the animation•The original Threads are free to listen to the buttonsThings a Thread should NOT do•The Thread controls its own destiny•Deprecated methods–myThread.stop( )–myThread.suspend( )–myThread.resume( )•Outside control turned out to be a Bad Idea•Don’t ever use these methods!How to control another Thread•Don’t use the deprecated methods!•Instead, put a request where the other Thread can find it•boolean okToRun = true;animation.start( );•public void run( ) { while (controller.okToRun) {…}A problem•What gets printed as the value of k?•This is a trivial example of what is, in general, a very difficult problemint k = 0;Thread #1: k = k + 1;Thread #2: System.out.print(k);Tools for a solution•You can synchronize an object:–synchronized (obj) { code that uses/modifies obj }–No other code can use or modify this object at the same time•You can synchronize a method:–synchronized void addOne(arg1, arg2, ...) { code }–Only one synchronized method in a class can be used at a time (non-synchronized methods can still be used)•Synchronization is a tool, not a solution—multithreading is in general a very hard problemThe
View Full Document