Threads ¡ CSCI ¡136: ¡Fundamentals ¡of ¡Computer ¡Science ¡II ¡ ¡• ¡ ¡Keith ¡Vertanen ¡
Overview ¡ • Mul,-‑threaded ¡programs ¡ – Mul,ple ¡simultaneous ¡paths ¡of ¡execu,on ¡ • Seemingly ¡at ¡once ¡(single ¡core) ¡ • Actually ¡at ¡the ¡same ¡,me ¡(mul,ple ¡cores) ¡ – Why? ¡ • Get ¡work ¡done ¡faster ¡(on ¡mul,-‑core ¡machines) ¡ • Simplify ¡code ¡by ¡spliEng ¡up ¡work ¡into ¡parts ¡ • Remain ¡responsive ¡to ¡user ¡input ¡ – Threads ¡in ¡Java ¡ • Crea,ng, ¡star,ng, ¡sleeping ¡ • Unpredictability ¡ • Debugging ¡ ¡ 2 ¡
“What Andy giveth, Bill taketh away.” hNp://www.gotw.ca/publica,ons/concurrency-‑ddj.htm ¡ 3 ¡
A ¡single-‑threaded ¡program: ¡single ¡core ¡ public ¡class ¡ Animal ¡ ¡ public ¡static ¡void ¡ main(String ¡[] ¡args) ¡ { ¡ { ¡ 1 ¡ ¡ ¡ ¡private ¡ String ¡image; ¡ ¡ ¡ ¡HashMap<String, ¡Animal> ¡map ¡= ¡ ¡ ¡ ¡ ¡private ¡ String ¡audio; ¡ ¡ ¡ ¡ ¡ ¡ ¡new ¡ HashMap<String, ¡Animal>(); ¡ ¡ ¡ 2 ¡ ¡ ¡ ¡public ¡ Animal(String ¡image, ¡ ¡ ¡ ¡ ¡map.put("dog", ¡ new ¡ Animal("dog.jpg", ¡"dog.wav")); ¡ 5 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡String ¡audio) ¡ ¡ ¡ ¡map.put("cat", ¡ new ¡ Animal("cat.jpg", ¡"cat.wav")); ¡ 8 ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡map.put("cow", ¡ new ¡ Animal("cow.jpg", ¡"cow.wav")); ¡ 9 ¡ 6 ¡ 3 ¡ ¡ ¡ ¡ ¡ ¡ ¡this .image ¡= ¡image; ¡ ¡ B ¡ A ¡ ¡ ¡ ¡ ¡ ¡ ¡this .audio ¡= ¡audio; ¡ 7 ¡ 4 ¡ ¡ ¡ ¡while ¡(true) ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡{ ¡ C ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡StdDraw.clear(); ¡ D ¡ ¡ ¡ ¡public ¡void ¡ show() ¡ ¡ ¡ ¡ ¡ ¡ ¡String ¡name ¡= ¡StdIn.readLine(); ¡ E ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡Animal ¡animal ¡= ¡ ¡ ¡ ¡ F ¡ ¡ ¡ ¡ ¡ ¡ ¡StdDraw. picture (0.5, ¡ ¡ ¡map.get(name.toLowerCase().trim()); ¡ H ¡ G ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡0.5, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡ (animal ¡!= ¡null) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡image); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡animal.show(); ¡ I ¡ J ¡ ¡ ¡ ¡ ¡ ¡ ¡StdAudio. play (audio); ¡ ¡ ¡ ¡ ¡ ¡ ¡StdDraw.show(100); ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡} ¡ } ¡ } ¡ AnimalMap.java ¡ Animal.java ¡ 4 ¡ A ¡single ¡core ¡computer. ¡
A ¡single-‑threaded ¡program: ¡mul,-‑core ¡ public ¡class ¡ Animal ¡ ¡ public ¡static ¡void ¡ main(String ¡[] ¡args) ¡ { ¡ { ¡ 1 ¡ ¡ ¡ ¡private ¡ String ¡image; ¡ ¡ ¡ ¡HashMap<String, ¡Animal> ¡map ¡= ¡ ¡ ¡ ¡ ¡private ¡ String ¡audio; ¡ ¡ ¡ ¡ ¡ ¡ ¡new ¡ HashMap<String, ¡Animal>(); ¡ ¡ ¡ 2 ¡ ¡ ¡ ¡public ¡ Animal(String ¡image, ¡ ¡ ¡ ¡ ¡map.put("dog", ¡ new ¡ Animal("dog.jpg", ¡"dog.wav")); ¡ 5 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡String ¡audio) ¡ ¡ ¡ ¡map.put("cat", ¡ new ¡ Animal("cat.jpg", ¡"cat.wav")); ¡ 8 ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡map.put("cow", ¡ new ¡ Animal("cow.jpg", ¡"cow.wav")); ¡ 9 ¡ 6 ¡ 3 ¡ ¡ ¡ ¡ ¡ ¡ ¡this .image ¡= ¡image; ¡ ¡ B ¡ A ¡ ¡ ¡ ¡ ¡ ¡ ¡this .audio ¡= ¡audio; ¡ 7 ¡ 4 ¡ ¡ ¡ ¡while ¡(true) ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡{ ¡ C ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡StdDraw.clear(); ¡ D ¡ ¡ ¡ ¡public ¡void ¡ show() ¡ ¡ ¡ ¡ ¡ ¡ ¡String ¡name ¡= ¡StdIn.readLine(); ¡ E ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡Animal ¡animal ¡= ¡ ¡ ¡ ¡ F ¡ ¡ ¡ ¡ ¡ ¡ ¡StdDraw. picture (0.5, ¡ ¡ ¡map.get(name.toLowerCase().trim()); ¡ H ¡ G ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡0.5, ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡if ¡ (animal ¡!= ¡null) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡image); ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡animal.show(); ¡ I ¡ J ¡ ¡ ¡ ¡ ¡ ¡ ¡StdAudio. play (audio); ¡ ¡ ¡ ¡ ¡ ¡ ¡StdDraw.show(100); ¡ ¡ ¡ ¡} ¡ ¡ ¡ ¡} ¡ } ¡ } ¡ AnimalMap.java ¡ Animal.java ¡ A ¡mul1-‑core ¡computer. ¡ 5 ¡
Mul,-‑threaded ¡animals ¡ • New ¡“magic” ¡program: ¡AnimalMapDeluxe.java ¡ – Random ¡spinning ¡frogs! ¡ – Frogs ¡appear ¡every ¡second ¡ – User ¡can ¡make ¡requests: ¡ • "dog", ¡"cat", ¡"cow" ¡ • Even ¡while ¡frog ¡is ¡spinning ¡ 6 ¡
Crea,ng ¡and ¡star,ng ¡a ¡thread ¡ • Thread ¡ – A ¡separate ¡path ¡of ¡execu,on ¡ ¡ • Also: ¡the ¡name ¡of ¡a ¡class ¡in ¡the ¡Java ¡API ¡ – Program ¡creates ¡an ¡object ¡of ¡type ¡ Thread ¡ • Crea,ng ¡and ¡star,ng ¡a ¡thread: ¡ Thread ¡thread ¡= ¡ new ¡ Thread(); ¡ thread.start(); ¡ Simple, ¡but ¡doesn't ¡actually ¡do ¡anything: ¡ • Thread ¡is ¡born ¡ • Thread ¡dies ¡ • End ¡of ¡story ¡ 7 ¡
Making ¡work ¡for ¡a ¡thread ¡ • Thread ¡constructor ¡can ¡take ¡an ¡object ¡ – Object ¡must: ¡ implements ¡Runnable ¡ • Interface ¡with ¡a ¡single ¡method: ¡ run() ¡ – run() ¡ may ¡do ¡work ¡forever ¡(e.g. ¡random ¡spinning ¡frogs) ¡ – run() ¡may ¡do ¡something ¡and ¡exit ¡(e.g. ¡print ¡a ¡message) ¡ – run() ¡can ¡call ¡other ¡methods, ¡create ¡objects, ¡… ¡ public ¡class ¡ BlastOff ¡ implements ¡ Runnable ¡ ¡ { ¡ ¡ ¡ ¡public ¡void ¡ run() ¡ ¡ ¡ ¡{ ¡ ¡ ¡ ¡ ¡ ¡ ¡for ¡ ( int ¡ i ¡= ¡10; ¡i ¡> ¡0; ¡i-‑-‑) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡System. out.print (i ¡+ ¡" ¡"); ¡ ¡ ¡ ¡ ¡ ¡ ¡System. out.println ("BLAST ¡OFF!"); ¡ ¡ ¡ ¡} ¡ } ¡ 8 ¡
Possible ¡code ¡execu,on ¡order ¡#1 ¡ public ¡class ¡ BlastOff ¡ implements ¡ Runnable ¡ ¡ { ¡ ¡ ¡ ¡public ¡void ¡ run() ¡ ¡ ¡ ¡{ ¡ 9 ¡ 7 ¡ 5 ¡ ¡ ¡ ¡ ¡ ¡ ¡for ¡ ( int ¡ i ¡= ¡10; ¡i ¡> ¡0; ¡i-‑-‑) ¡ 8 ¡ 6 ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡System. out.print (i ¡+ ¡" ¡"); ¡ ... ¡ ¡ ¡ ¡ ¡ ¡ ¡System. out.println ("BLAST ¡OFF!"); ¡ ¡ ¡ ¡} ¡ } ¡ public ¡class ¡ Launch ¡ ¡ { ¡ ¡ ¡ ¡public ¡static ¡void ¡ main(String ¡[] ¡args) ¡ ¡ ¡ ¡{ ¡ 1 ¡ ¡ ¡ ¡ ¡ ¡ ¡System. out.println ("prepare ¡for ¡launch"); ¡ 2 ¡ ¡ ¡ ¡ ¡ ¡ ¡Thread ¡thread ¡= ¡ new ¡ Thread( new ¡ BlastOff()); ¡ 3 ¡ ¡ ¡ ¡ ¡ ¡ ¡thread.start(); ¡ 4 ¡ ¡ ¡ ¡ ¡ ¡ ¡System. out.println ("done ¡with ¡launch"); ¡ ¡ ¡ ¡} ¡ } ¡ % ¡java ¡Launch ¡ prepare ¡for ¡launch ¡ done ¡with ¡launch ¡ 10 ¡9 ¡8 ¡7 ¡6 ¡5 ¡4 ¡3 ¡2 ¡1 ¡BLAST ¡OFF! ¡ 9 ¡
Recommend
More recommend