Threads and MultithreadingMultiprocessingMultithreadingWhy multithreading?ThreadsSleepingStates of a ThreadState transitionsTwo ways of creating ThreadsExtending ThreadImplementing RunnableStarting a ThreadExtending Thread: summaryImplementing Runnable: summaryTwo kinds of ThreadsThings a Thread can doAnimation requires two ThreadsHow to animateThings a Thread should NOT doHow to stop another ThreadHow to pause another ThreadA problemTools for a solutionwait(), notify(), notifyAll()The EndJan 14, 2019Threads and Multithreading2MultiprocessingModern operating systems are multiprocessingAppear to do more than one thing at a timeThree general approaches:Cooperative multiprocessingPreemptive multiprocessingReally having multiple processors3MultithreadingMultithreading programs appear to do more than one thing at a timeSame ideas as multiprocessing, but within a single programMore efficient than multiprocessingJava tries to hide the underlying multiprocessing implementation4Why multithreading?Allows you to do more than one thing at oncePlay music on your computer’s CD player,Download several files in the background,while you are writing a letterMultithreading is essential for animationOne thread does the animationAnother thread responds to user inputs5ThreadsA Thread is a single flow of controlWhen you step through a program, you are following a ThreadYour previous programs all had one ThreadA Thread is an Object you can create and control6SleepingEvery program uses at least one ThreadThread.sleep(int milliseconds);A millisecond is 1/1000 of a secondtry { Thread.sleep(1000); }catch (InterruptedException e) { }sleep only works for the current Thread7States of a ThreadA Thread can be in one of four states:Ready: all set to runRunning: actually doing somethingWai ting, or blocked: needs somethingDead: will never do anything againState names vary across textbooksYou have some control, but the Java scheduler has more8State transitionsreadywaitingrunning deadstart9Two ways of creating ThreadsThe easy way:Extend the Thread class:class Animation extends Thread {…}And override public void run()You can only extend one class, so if your class already extends some other class, you can’t do thisThe more general way:Implement the Runnable interface:class Animation implements Runnable {…}Override public void run( )Create a new Thread with this class as a parameterMost of the time, you need to do things the second way10Extending Threadclass Animation extends Thread { public void run( ) { code for this thread } Anything else you want in this class}Animation anim = new Animation( );A newly created Thread is in the Ready stateTo start the anim Thread running, call anim.start( );start( ) is a request to the scheduler to run the Thread --it may not happen right awayThe Thread should eventually enter the Running state11Implementing Runnableclass Animation implements Runnable {…}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 JavaAs always, start( ) is a request to the scheduler to run the Thread--it may not happen right away12Starting a ThreadEvery Thread has a start( ) methodDo not write or override start( ) You call start( ) to request a Thread to runThe scheduler then (eventually) calls run( )You must supply public void run( )This is where you put the code that the Thread is going to run13Extending Thread: summaryclass Animation extends Thread { public void run( ) { while (okToRun) { ... } }}Animation anim = new Animation( );anim.start( );14Implementing Runnable: summaryclass Animation extends Applet implements Runnable { public void run( ) { while (okToRun) { ... } }}Animation anim = new Animation( );Thread myThread = new Thread(anim);myThread.start( );15Two kinds of ThreadsThere are two kinds of Threads in Java:Nondaemon threadsThese are “independent” threads, which run until they reach a stopping point (for example, the end of your main method)Whenever you start a program, you get one nondaemon threadWhen you create a GUI, you get another nondaemon threadDaemon threadsThese are threads which die when all nondaemon threads finishThe Java VM exits when only daemon threads are still runningThere are methods setDaemon(boolean) and boolean isDaemon()The System.exit(int) method kills all threads16Things a Thread can doThread.sleep(milliseconds)yield( )Thread me = currentThread( );int myPriority = me.getPriority( );me.setPriority(NORM_PRIORITY);if (otherThread.isAlive( )) { … }join(otherThread);17Animation requires two ThreadsSuppose 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 animationsleep(ms) doesn’t help!18How to animateCreate your buttons and attach listeners in your first (original) ThreadCreate a second Thread to run the animationStart the animationThe original Thread is free to listen to the buttonsHowever,Whenever you have a GUI, Java automatically creates a second (nondaemon) Thread for youYou only have to do this yourself for more complex programs19Things a Thread should NOT doThe Thread controls its own destinyDeprecated methods:myThread.stop( )myThread.suspend( )myThread.resume( )Outside control turned out to be a Bad IdeaDon’t do this!20How to stop another ThreadDon’t use the deprecated methods!Instead, put a request where the other Thread can find itboolean okToRun = true;animation.start( );public void run( ) { while (okToRun) {...main loop...}21How to pause another ThreadDon’t use the deprecated methods!Instead, put a request where the other Thread can find itboolean paused = false;public void run( ) { while (okToRun) { while (paused) { try { Thread.sleep(100); } catch (InterruptedException e) { } } ...main loop... }}22A problemWhat gets printed as the value of k?This is a trivial example of what is, in general, a very difficult problemint k = 0;Thread
View Full Document