From 35f646b06fa7c32e3faef3fa89efed91e7161839 Mon Sep 17 00:00:00 2001 From: Kanken6174 Date: Wed, 25 Jan 2023 14:46:44 +0100 Subject: [PATCH] part 2 --- .idea/uiDesigner.xml | 124 ++++++++++++++++++ out/production/TP2/Main.class | Bin 516 -> 1369 bytes out/production/TP2/Main2.class | Bin 0 -> 1405 bytes out/production/TP2/sweet/Boulangerie.class | Bin 0 -> 1062 bytes .../TP2/sweet/BoulangerieThreadSafe.class | Bin 0 -> 1083 bytes out/production/TP2/sweet/Client.class | Bin 0 -> 904 bytes out/production/TP2/sweet/Gateau.class | Bin 0 -> 259 bytes out/production/TP2/sweet/LimitedClient.class | Bin 0 -> 889 bytes out/production/TP2/sweet/Patisserie.class | Bin 0 -> 271 bytes out/production/TP2/sweet/Patissier.class | Bin 0 -> 1139 bytes out/production/TP2/world/ThreadWeaver.class | Bin 0 -> 3150 bytes src/Main.java | 20 ++- src/Main2.java | 24 ++++ src/sweet/BoulangerieThreadSafe.java | 29 ++++ src/sweet/Client.java | 14 +- src/sweet/LimitedClient.java | 20 +++ src/sweet/Patissier.java | 19 ++- .../{threadWeaver.java => ThreadWeaver.java} | 19 +-- 18 files changed, 254 insertions(+), 15 deletions(-) create mode 100644 .idea/uiDesigner.xml create mode 100644 out/production/TP2/Main2.class create mode 100644 out/production/TP2/sweet/Boulangerie.class create mode 100644 out/production/TP2/sweet/BoulangerieThreadSafe.class create mode 100644 out/production/TP2/sweet/Client.class create mode 100644 out/production/TP2/sweet/Gateau.class create mode 100644 out/production/TP2/sweet/LimitedClient.class create mode 100644 out/production/TP2/sweet/Patisserie.class create mode 100644 out/production/TP2/sweet/Patissier.class create mode 100644 out/production/TP2/world/ThreadWeaver.class create mode 100644 src/Main2.java create mode 100644 src/sweet/BoulangerieThreadSafe.java create mode 100644 src/sweet/LimitedClient.java rename src/world/{threadWeaver.java => ThreadWeaver.java} (71%) diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/out/production/TP2/Main.class b/out/production/TP2/Main.class index 9a93b5fe0abcb3074eba8a3fe3f89263700d847d..4e1b9e55fc0913b2acf0c0b75fdd8d1e304ee6a4 100644 GIT binary patch literal 1369 zcma)6ZBrXn7(F-HaGPZ*0a9$L)^>bLn$oR`6-z}SwzV}tB{XeX9bGn8*t+a8n_c2R z@^fb#=*U>V`^jIVo+n`nm40wDxp($?J?Gr#?w^1E_8hznZH-e3ll?deyYBi{V!ZAHwdJ1Q&kDDi}uz_T};owbSU+4=NvApHrf>`oN78R%z zAN`k&ckr&pdk)@5^(C!_Qm{ZTG-gM^s@@gomlVz)HN6w1CP}iL)O2tD?36TiB)}6YadF5u8q&I zpz*nbFR-X^`iNmOjy4tat`}xz^+$y%N_C8vxCut1;owW$WMpFem=h+E|BVxkZ?pBX z7m%*ih`WYE)(j%El5KC8WL*T}_%vhR3)@~2$orwuO1A>e#Yj_<=b61dC^G%hoV3y; zAf8%VL9x(v)c^QdBFf_;Zt3udw8wBhu8T(U&h5}c>5QOU#Gj?saX4%`D5l+T+Q!cwqC~dXSlJ4rKjvS z$8XglYRE(IUE{z5r}!(P#IH*Qqqs_>v$W6AvVbW@PoRNG;w|Go&ft4Y5BSUybAvgn zxCcwn;~T6Esy##t>+Dsc=RVq$s)E~ifQRhbVMGPFe^}Pic%-2OD;`b!tKn3P5{BZ5jAYVd z$hSKK2PHT*Tn|g|{FL9{cA0wq@QTP!)^&H4Boj=DsJA!T8&#S zDp<8q^-#kaLv4YJ!G16d6%n>Q=Vk{asEj7v&cH^4!Mfm*I;_)pEEvjxjKpOc4u!tq zLq$q8h(}xvxRxgW5v}B2&ghDPF?Y!wW{^hvZqYte=Xyf@wFPAcw;!i^B+jJS&N0Lz za~-r$r$;s;2WFm`;yPtMt&G;f;Tzagt8IU>Veqz;F-sKqY>=?VI>P6b*+Ff$_3?Ajh;RJ;u^|{Fc%%R4aj& zI3i&8B5HxJ!^A=fMZ@TrjR_nVuvDvM;5u##94kL_4`yKj6LHeUCq{>S$FyZEpV~NW zEZH~>^VEz#`Im*y@rA@$8|P5|k7~VUnV=nLy&;e*-#66H3!K_3dM`|L9H$$JZr%RP z(;JB&g%TG8j_+Z}H}Ti?2fu|XE*ga#)55+ESTX7tA=pBJGG4ZE1y=1 zG-#I$IC_`&W{^;Drl(KH}AW~T(ahKFr?d!o@V$u z)0jcrKPmMj_Q|Ny5D?6CdLM z2AdbQF}zUCzsG1ZJ6Uh$c2F|5@%k2yR=041|5GKLd5h0pVfY5!)#gNQ8dqT7{cE`>@ux{`JrL`RD6*01GJFNFZq;<=_O;0@)3@ElYLj zt(9J^ZYb9Xr02D#&4NHOUs$$~5g3kwnnu@44}w7MR&;1=SV;Du7mkHK2mKfj7z}rm zGNp%plYuJGifGYYC@@+%h7!pcbTGtP(w=Yhn_VW4I2gqkNszS~rRLkYT{6ps*Bm$D zU=mXTsZhV8Vx)MH8$9LUG!s)hQX30r1g1NEE_y}X5}25!+C25xgjaW>EoU0n&-4w8^elu{@6V1xA zU9#r*M<7Rolc0g5@;o~9Ezl`}B2u)c$)t5A8rUT5fNXIeqWBHgt9|r*f&D3po~4z4 zH^~1KGPpuJryY+ul<1VhRa}c%PbrdP`-?5&eTF^L!thFm)Q=>;5@`T^$VRlWc1BF& z*Xy`Jyc}-gR?K}Lb7z^^!uW@%!pXgZ-<7?CUwoNt;p`7wsKiAtt;~F+T$^Zvn5L@S z#~5|ZtBr9Q{RyftNp4JashBvhrY3Q?3?Jc$CiR7yknAx MfdcpFC4u{Y0eeu>Y5)KL literal 0 HcmV?d00001 diff --git a/out/production/TP2/sweet/BoulangerieThreadSafe.class b/out/production/TP2/sweet/BoulangerieThreadSafe.class new file mode 100644 index 0000000000000000000000000000000000000000..558050e467d06a5b3ff7c7d9faf9f2fbf2e068ba GIT binary patch literal 1083 zcma)5U2hUW6g{&bTejP>U_otd)mjy(cGV{n8lp9tG=cg-L*kpmGQt+z-7K?y{32i5 zMAK9gj<4EfP}A*8+IM?>!Q zMCb~J%(m;fvd)kySK2z}7;YW#cifJoJG33&bD}U5p0po@A^*5D^qqn0^3W1Q9t&(gpg~vp4f}t zc0{<(J45mm8otAaZ63PHPMm4kcS+RM1nbPFo`_GNnXU-@5rL3AQ>>LX0}B+vRES}r zCAl+b@*pA1aHlUMAt`NUgw&|Xt!ihQ~1XPBEOC}{YEbn_@KFsP-A6jqRn<1_-a=$(&YOEFC@fh7=BP^HRE z%GaSab*d)wHtr;BFX>jDS&Hoh%M3rTcGzHtJ9(^ literal 0 HcmV?d00001 diff --git a/out/production/TP2/sweet/Client.class b/out/production/TP2/sweet/Client.class new file mode 100644 index 0000000000000000000000000000000000000000..16ea4c110bbcf60262939be5f020de2113e14f51 GIT binary patch literal 904 zcmZuv%Wl&^6g`tiCvlxVk~Fj_4XJoEPNCub3hIK2N>l+NQU$h?WYkV^Y|9?=*zq?N z%OWU<1sisJ3LgPn$5Bf~EqUxS_ug~Py)!?5fBOz#9rq0+kmN|2NMnLwW>35p4O=)n zjc2_*+1Csc50sZvQq#8E7dAto74JWE!-z`y zN;VBlVVYyc#4Pd*v;Sp~lIZVBEg6b6Ys}CVS_Q#~Ad4dAI7%kYVE%;D&bvU%AsKW- zGBMX0^`P8F+gFb6XkUt9GlMcid22PY3shw4yNy(4-9XR*XlF>wx6>fjU(2JS_S zwnHMdSY2 zKX$bA{m|2L@aSz{dRn;-$7P26anAG5aYWCiX_acHjN9rG_l7&5_;gD-@@Y8iNq;-8 z$hV?%>Iz>)c)Xd?yDDIq8k5Cm+GJoonyepE(~QWf|MY#DO)AKBwCKNjBD^uN(Q!k+ zFE>?Wb~5H&iyFZ)-KGQ>R_QH9H;QH#;WVz$x<+V|aDu)@{R>!q^)vXvD5pW|6q2-> zNFj$Tp{s;SaW<~uIw7jV4ay+vxQU4|=ld~drTz*05V;p0QOGYGVzG$juQ!bcmNM2zN&-WWM*eF z-_O3@k0*ctz5@fM4a-Fhb%LK?rPSlK&??VmrX-<0Q;E_6!R!xqHW~!C3N3|}q99oF z^uReUREb;_=e^9fVjr{94bw=(JCUhU|4d6CRZi%H|4pU@XOk9LBp0fzY*oESCvg$z u!R95)LwtEn#wM%DR|B=-9du*EfWuh+2=HLRM~h!B$2i2?X6DI^2D}e=VgWSRt7~%71&OaQ8VD!mNVwD<8LaK zMW`SaY}oNBd<1Zvgi=Jj7|p%++;h&op6@@udV&wRm+)H9{Q2Xy+aX7(XzWaWRcUL8(4tBP@ZBOIg&~Y{*a_yzt3H&&Y{q; zguI4=fg(x_#s5Ue1Md%o5)2i~o-wq!lH>8jLk<-zYp5DHhw}`D7yK1(#txgEw__zn z3`swtNtT^SMf%NlC_U9tq2Qxd7Bz~`YXhF>FdL(B}^`=e~r4MOcY1(=GwRNoHiiWEOHemhZ`d~=L1`O%3D@4GMvi9w+ zh6Y3Z?`V6T5@8qxwB$!``XW%$C(YEZKcF?`9qEau(WocF1Kx8fQ*z=T(B+|w<5@DL zhH@P5WzIiqF|ZzOE{upaY1v(hiN`!M(>x2*w%Ad;|MCeBW-5BekHWrqET=xsK8)>n z9<0#|N=%lL08NbyotqTzP&UqI8k?WMj_H=bH9F(>3c|(6ExJ{wC~Tui5#ezi25~Ul zz|9%gJHo_W^~OhNCs=&;0p-%l2`*Hy_8FIte*JKckUS=If%sNnBRSEkL!+(*a%fOx piE2fv=24?)73EX?8sTr@HuaOn%*h?PXDR<&gPo+xU5XR9_Zy}=#isxO literal 0 HcmV?d00001 diff --git a/out/production/TP2/sweet/Patisserie.class b/out/production/TP2/sweet/Patisserie.class new file mode 100644 index 0000000000000000000000000000000000000000..f8bab47b7c5c1e51e4f7abd5e42f38e08a32b714 GIT binary patch literal 271 zcmZ8cO%K695PegvQXg&n12-J>;7D8~PJ)EEZ)?L!wMo19T}~1QKfsR?vm%k0N#5*x zv%B-=`MN&wc ze>3{V8QO5!unFR1%ZycKgAWIs-VJnR!GgzVwgc+0(Ln8UB1VUm23JCp(SrX5f3r6P literal 0 HcmV?d00001 diff --git a/out/production/TP2/sweet/Patissier.class b/out/production/TP2/sweet/Patissier.class new file mode 100644 index 0000000000000000000000000000000000000000..bec6178f9aee797f4a3a9be823d7c3bded6e9394 GIT binary patch literal 1139 zcma)5+fvg|6kUh5q=aw_P_W!8Dzrr!9j{nK0YPD^GM4EKyrt|2KiJ}+{PURcQxF@{Wh-KRiaZNa~n42b=l5MISvmPCeHyk9G`n$Q1^Ld z?VZKzzHl7{iwydC47JuV%Qo4S_+!__24zZwz3Nuzyssb}{vxQAxwqZS&3B>#iDovIu|g}kUZpcqg(v82)%bu&7?sO@hIWj^N6gTlev0JI z3C52x@d;P-%rWMMaPtdp9sK%HI6&l(vQwBr1`CugIZPuSR!}iQ*JPAVlXN~o5o5?= j9P^ku;0B)kN2M#yI|yffyRBNZTbfUV#(B~f+m61AgJVN8o> z^HnH_HDf6>1rKOghUEe)FFLMO=s!K-8hYW3p-&sGfZ~>H+i*Rum961Oh>V=RLc>Zq zSDDgnecULhXhXY#4h^fYy27uvG+`P&pZHS(TaxEP#0dRNDzZoz*gq1)XO?0O)+%^V zLl@Qwtg4Zzi{k>mBk563GKv;ZUWx=ZDA=gsA#@8YtAT`58udb9(6R(NlMy0Aj%6{o zrekMP=On}?4G$wJ&}90CtNRY~)KRzCvGO=sr_rmRPs3(xA*I@al@R7`LidJ^OJvNF z5kHMbG;GB-fw&zEw^gvCnNqN$f)@;*Vx9Cc%TTbhlJ{UdET@VA?3Sk4!_<|v)lJK! zMy0ZhhJDyiCQO7tdo(gM7&9QT9@X%eG~g1?*Il}400%V;$&vU4$Fvn37FZXE4OTg3 zGa+uN=o^K@m-0qY=CT=&zEX*^Zg5%q|yLs8;e_C31G5UEj>em|q( zX{l17o+;DTRh+|l1blNpE6c*|C<^vV3Gx#(kG1}$Ik2i8PlI&i&e0FZmvzy zf>nq|c3CwY1DMiaOC`(;35nzCOWjQbNN6}DyXKc%>& zO20}D!AZ5c?qsP_ON|O>j5BJH?a?Es8c17Tl*gZdU<%q6lPU1Ph_B}-b9%ANFXoo$ z93ju0$b_<7*3mWcPH>_&m;_ElViwyRl++rnrF0Xws5G8AWd!@8d>&WLCbKZ&l-#^= z#FSZF5k1Ja$i2u-cF=Kr&v*4=&hRIkg15X8pQ-p9Unuxey6Y=eueNPXd)k>a0eNMS9|x^v#f^d!FGbxGKv!<3&KAo*4zNxY75P8pB0@hV;;qQL7_(pShpGTAPX=g}jO z?VU$T;2Jiv(Jyct+jIP}_wt$I7g3r#`mmc{QTwnZ(3EB>)2z4D6le76 zK$9%-{;DgF5C%I;|Q?9eZWS|T4C|FlKM81+s?lo*u|3V<#UKqv)B`{+L~&~a*>j0 lh=nEVljLLgh;$q9F+SnDi84Or|JV4IJ(aERxcz=W=YML3;|2f# literal 0 HcmV?d00001 diff --git a/src/Main.java b/src/Main.java index 1f5c4cc..a233f4a 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,5 +1,23 @@ +import sweet.Boulangerie; +import sweet.Client; +import sweet.Patissier; +import world.ThreadWeaver; + public class Main { public static void main(String[] args) { - System.out.println("Hello World!"); // Display the string. + ThreadWeaver tw = new ThreadWeaver(); + Boulangerie b = new Boulangerie(); + Patissier p = new Patissier(b); + tw.addRunners(p, new Client(b)); + tw.weave(); + tw.run(); + + try{ + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + p.shouldRun.set(false); + tw.recover(100L); } } diff --git a/src/Main2.java b/src/Main2.java new file mode 100644 index 0000000..63d0342 --- /dev/null +++ b/src/Main2.java @@ -0,0 +1,24 @@ +import sweet.Boulangerie; +import sweet.BoulangerieThreadSafe; +import sweet.Client; +import sweet.Patissier; +import world.ThreadWeaver; + +public class Main2 { + public static void main(String[] args) { + ThreadWeaver tw = new ThreadWeaver(); + Boulangerie b = new BoulangerieThreadSafe(); + Patissier p = new Patissier(b); + tw.addRunners(p, new Client(b)); + tw.weave(); + tw.run(); + + try{ + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + p.shouldRun.set(false); + tw.recover(100L); + } +} \ No newline at end of file diff --git a/src/sweet/BoulangerieThreadSafe.java b/src/sweet/BoulangerieThreadSafe.java new file mode 100644 index 0000000..414c0bc --- /dev/null +++ b/src/sweet/BoulangerieThreadSafe.java @@ -0,0 +1,29 @@ +package sweet; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.TimeUnit; + +public class BoulangerieThreadSafe extends Boulangerie{ + private final BlockingQueue sweets = new ArrayBlockingQueue(50); + + @Override + public void depose(Patisserie p) { + try{ + sweets.put(p); + }catch(InterruptedException ignored){} + } + + @Override + public Patisserie achete() { + try{return sweets.take();} catch (InterruptedException e) {} + return null; + } + + @Override + public void getStock() { + // TODO implement here + } +} diff --git a/src/sweet/Client.java b/src/sweet/Client.java index 5f0dc21..6d0c75e 100644 --- a/src/sweet/Client.java +++ b/src/sweet/Client.java @@ -4,15 +4,25 @@ import java.util.*; * */ public class Client implements Runnable { + protected final Boulangerie local; /** * Default constructor */ - public Client() { + public Client(Boulangerie b) { + local = b; } @Override public void run() { - + while(true) { + local.achete(); + System.out.println("J'ai acheté ma patisserie"); + try { + Thread.sleep(80); + } catch (InterruptedException e) { + break; + } + } } } \ No newline at end of file diff --git a/src/sweet/LimitedClient.java b/src/sweet/LimitedClient.java new file mode 100644 index 0000000..72e908c --- /dev/null +++ b/src/sweet/LimitedClient.java @@ -0,0 +1,20 @@ +package sweet; + +public class LimitedClient extends Client{ + public LimitedClient(Boulangerie b) { + super(b); + } + + @Override + public void run() { + while(true) { + local.achete(); + System.out.println("J'ai acheté ma patisserie - Limited"); + try { + Thread.sleep(80); + } catch (InterruptedException e) { + break; + } + } + } +} diff --git a/src/sweet/Patissier.java b/src/sweet/Patissier.java index 4fdab00..8112f73 100644 --- a/src/sweet/Patissier.java +++ b/src/sweet/Patissier.java @@ -1,19 +1,32 @@ package sweet; +import world.ThreadWeaver; + import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; /** * */ public class Patissier implements Runnable { - + public AtomicBoolean shouldRun = new AtomicBoolean(true); + private final Boulangerie local; /** * Default constructor */ - public Patissier() { + public Patissier(Boulangerie b) { + local = b; } @Override public void run() { - + while(shouldRun.get()) { + local.depose(new Patisserie()); + System.out.println("J'ai produit ma patisserie"); + try { + Thread.sleep(100); + } catch (InterruptedException e) { + break; + } + } } } \ No newline at end of file diff --git a/src/world/threadWeaver.java b/src/world/ThreadWeaver.java similarity index 71% rename from src/world/threadWeaver.java rename to src/world/ThreadWeaver.java index df60c6b..0d6f700 100644 --- a/src/world/threadWeaver.java +++ b/src/world/ThreadWeaver.java @@ -1,14 +1,14 @@ package world; -import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -public class threadWeaver { +public class ThreadWeaver { private final List runners = new ArrayList(); private final List managed = new ArrayList(); - public void addRunners(Runnable... runners){ - + public void addRunners(Runnable... addedRunners){ + runners.addAll(Arrays.stream(addedRunners).toList()); } public void weave(){ @@ -26,7 +26,7 @@ public class threadWeaver { public void recover(){ for(Thread t : managed){ try { - t.wait(); + t.join(); }catch(InterruptedException ie){ System.out.println(ie.getMessage()); } @@ -37,19 +37,20 @@ public class threadWeaver { public void recover(Long timeout){ for(Thread t : managed){ try { - t.wait(timeout); + t.join(timeout); }catch(InterruptedException ie){ System.out.println(ie.getMessage()); } - managed.remove(t); } termina(); } public void termina(){ for(Thread t : managed){ - System.out.println("Thread "+t.getName()+" has not stopped being cleaned up"); - t.interrupt(); + if(t.isAlive()) { + System.out.println("Thread " + t.getName() + " has not stopped being cleaned up"); + t.interrupt(); + } } managed.clear(); runners.clear();