From 4e79b63e748553b88082e82300fecdace87a964b Mon Sep 17 00:00:00 2001 From: Vyaceslav Sv Date: Wed, 1 Jul 2020 17:09:31 +0300 Subject: [PATCH] first commit --- lesson05/.idea/.gitignore | 2 + lesson05/.idea/description.html | 1 + lesson05/.idea/encodings.xml | 6 + lesson05/.idea/misc.xml | 9 + lesson05/.idea/modules.xml | 8 + lesson05/.idea/project-template.xml | 3 + lesson05/.idea/vcs.xml | 6 + lesson05/lesson05.iml | 12 ++ .../production/lesson05/Geekbrains/Car.class | Bin 0 -> 2782 bytes .../production/lesson05/Geekbrains/Main.class | Bin 0 -> 3252 bytes .../production/lesson05/Geekbrains/Race.class | Bin 0 -> 751 bytes .../production/lesson05/Geekbrains/Road.class | Bin 0 -> 1601 bytes .../lesson05/Geekbrains/Stage.class | Bin 0 -> 471 bytes .../lesson05/Geekbrains/Tunnel.class | Bin 0 -> 2141 bytes lesson05/src/Geekbrains/Main.java | 193 ++++++++++++++++++ 15 files changed, 240 insertions(+) create mode 100644 lesson05/.idea/.gitignore create mode 100644 lesson05/.idea/description.html create mode 100644 lesson05/.idea/encodings.xml create mode 100644 lesson05/.idea/misc.xml create mode 100644 lesson05/.idea/modules.xml create mode 100644 lesson05/.idea/project-template.xml create mode 100644 lesson05/.idea/vcs.xml create mode 100644 lesson05/lesson05.iml create mode 100644 lesson05/out/production/lesson05/Geekbrains/Car.class create mode 100644 lesson05/out/production/lesson05/Geekbrains/Main.class create mode 100644 lesson05/out/production/lesson05/Geekbrains/Race.class create mode 100644 lesson05/out/production/lesson05/Geekbrains/Road.class create mode 100644 lesson05/out/production/lesson05/Geekbrains/Stage.class create mode 100644 lesson05/out/production/lesson05/Geekbrains/Tunnel.class create mode 100644 lesson05/src/Geekbrains/Main.java diff --git a/lesson05/.idea/.gitignore b/lesson05/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/lesson05/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/lesson05/.idea/description.html b/lesson05/.idea/description.html new file mode 100644 index 0000000..db5f129 --- /dev/null +++ b/lesson05/.idea/description.html @@ -0,0 +1 @@ +Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/lesson05/.idea/encodings.xml b/lesson05/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/lesson05/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lesson05/.idea/misc.xml b/lesson05/.idea/misc.xml new file mode 100644 index 0000000..adbdd33 --- /dev/null +++ b/lesson05/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/lesson05/.idea/modules.xml b/lesson05/.idea/modules.xml new file mode 100644 index 0000000..311dbd2 --- /dev/null +++ b/lesson05/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/lesson05/.idea/project-template.xml b/lesson05/.idea/project-template.xml new file mode 100644 index 0000000..1f08b88 --- /dev/null +++ b/lesson05/.idea/project-template.xml @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/lesson05/.idea/vcs.xml b/lesson05/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/lesson05/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lesson05/lesson05.iml b/lesson05/lesson05.iml new file mode 100644 index 0000000..d5c0743 --- /dev/null +++ b/lesson05/lesson05.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/lesson05/out/production/lesson05/Geekbrains/Car.class b/lesson05/out/production/lesson05/Geekbrains/Car.class new file mode 100644 index 0000000000000000000000000000000000000000..03054259f6a6c938ee98c7560a9f9bfc4796cf7e GIT binary patch literal 2782 zcma)8TXz#x6#h<2D(4#?r4g4aS&(fte(=&8aX91cU^ z^$?EYSO~{)A`G9Lp2Vrj?YC%(zYtDC3&Sthb@VAPLa4(T1^o&J6qo{`_>S(xsrZ3I zT|EM#T_E6Sx*;&XV~=4ZdmYWR(y?wXwFp$ChYh2TDwZ}xm2k(Pc2(Q7)2_enUkDXBCX7IEPUM=T%(5#UL(8 zbC(rdQSlb8D!8WNZ8QgQUBL|%@8G6_cU9cNdqKRf-~$yOVw1pv=`^0=M#XJ33(PHY z%+w%~Y25?8gN9CU;pwIBjAh9L3*invqT$>(lQ(k@Ca+Fj%l(ua&rL*D3xP#LTGEKK zA~g4i=?+jzyPD-P6KkXGWz)L42!%{JaxN2862Vi8p4Ng_YC9Z98|^UDE^jv&Km5fN#e^&2s*S!;~~>k73|+?mP}nd^aFez4I zZ8<}vV0BpvN(-8oq(AL-0yQF%dz^d1M0k>WlpCMC#-zBz{F=_4PR$))qj5B=&z1y5 z>vxqf*E2wJ*nBI}DZ?1%HAeTz+fa)Q3#=-SthCB2v=PlD{ncKeUXSUKU0=b+vVcBk zADG5vT4(K~QE2e_v~AOL*LGNUUlMSKZ6`CtqqbX?;lxu~IxVyEZZUNQ8~M`T%Lr3O zdQJXdOHpSkJR(IaB?o&(hmA7o$BXm}`CEM11ru>Cl}ebd(W2lkAE#OImBS{m{NMEu z;XA#IukdnI@~vg392kRWXdHvmusAS=;KL~|s}Q7o5&@h-75{I{g@%RbB?o zMT%_1;bI@38+ii@Jpk+YCoV!r1X2j*Mam)g|A0^Yj`&n;$Ll%pV+()o;V-`yudfxb?^3PiyZJzW|RO39;?gG(W z?SAQCDSyi~1JH6$n-WtAZHsj7IG2qa#Rc;l(+Q>6-opx>P}_AK3? zAhELV&zbL@pYNP|X7`_8Uc3z84xHAo7Gn~7TG5BS8e-Td@e>URHIHkM*w>02CQ{h1 z;Q$_x_^Cu*;z14V3UW|G2OiR(<6((I8Xm!;$$R^#njfXo(9nrV33Dk0Ga9;KtKo>U zFq=Xlg`z?@YVS&vG^|$cJSO1@Xd_$4bB~Pd-M?o-K#U5+3$8gU(3?GC95pf(-!5cK z*D))eXE}aGJuGLk9ESvwTWrVnhXq>F>kshch&yEoEXmrAwWm^?w7dypvOvjF;*G)q z!?V?XUKsah?6Sc1*_L&uXz+Bb7sLdw;7&iTOJLzm{SFTwO0YV702K19&@sWZ_X%mxmXhD zX^zfWMWZz1dY0mcYImwg;+|oWhlW_kDN?bThNoya80BHaP+nb^^9^%$%qWG7NeoDA zWx{qmZdxVZcAc^W|9k=qMsae==u@=y-6n8|#6?(D+D4mu+epM!Fpcr61f;f*zk2Gm zoLlisYp1Oe-Kr9Jt128F8_+MXx@i$LSk-Y0)+u;JU`=y)g98GqnxYnnmpH297#
%AV--}GKUc$(0_~Bf%#g%WI(~s) z>PTa~f;>$tVW464Pt16h(%G@ib^WsM8Kp7HpK+(kOOkk|1O1$SrQ=!rS{?n3j_1&? z^Pp`_^RDB60GX1fuFsTM=X<9p}(oVZJs-8IrH~@;r@JGNg=_bj&FHh zrQ};v5kNdWs_H$Gh}>M+w~A~6ZiVK$>Q}~gGyB+`eD)~IDDvudhHf;91!PHq3iP}y zT|fBE&bDS={>`?#P~2hvQ;jiFJz)Wc584+CX3X$s*nvpjl&joLuiq|kFdaP?cA%>? zhI$4R@k7_x6*Rnv-)npw9j7&~!XO`Obn|;|LlFYUdAZb^g~YFj61yN*IZTv&!(+-4 z#xcX@oMLIQhdI*%>#o9jL!Sx>ZZ*H|MG`ORIDuDn>;~VO^+p$_({_%s+A`U&C-asX zhYizry*Yul;^I!?HKr%)y0aC&O!QH<2XCZcl*<<12Jc6snAcao@4K1Lf>rLTADquk zw2C6MG#s3mD_K$awLh$z{Pwf!|KIG0Q7GhW-x`v5o$uDg%51RQ7*E5EY=%QG3v4aF z=ER_>_Xby*YM7kk5Nv(@95-^8;Vd{OHdG(u=!HT(-khw!x!F4yaH-^A_sGk%P}VgT=95P#?XAGjOuV;CP|D?Y(C{G0QCupOUahY;8mW~4;z9?$=X zIwenc@!UG3@D|6q>?2yPub3TL7@$vW_%FS6{p43Po01rjh)Ev8 z8VH7uYyK$XbJ`^~rd+hA@7wqNo#*|y`*V2>;3anIu(0aD#v>bR4j$u)gDRfdShuku zU?r&>sYGDeKb2pkH%@iny^3S`)z?Yd6{z?0D3s|qRs!v^m_7fEQlAI0)M4WF46VCw z@3By&azoRQy2>0(utxXefiejJ2^R&RTk+iCZY%_+Abb zLA&Kw+#}A~)1glH1)8nnA}p8R?h7MoY>jEN;} zw6W>pIkrs5HmfZ(%*Yp*&yoTej=ZD6sT!sN)s~Tw|M)i)R&U9~j7DIa+W*h%78^a8 z;A*Qdwu2}L$k$QWZTGRk<*>OY0u@sNPlr|oGkgSGJm5J?k4H=Joa+39_@0H#@oi%H2MOrzgfp4sMnSTuA9csh@OPzC6I=@lb2mbda3hLo*< literal 0 HcmV?d00001 diff --git a/lesson05/out/production/lesson05/Geekbrains/Road.class b/lesson05/out/production/lesson05/Geekbrains/Road.class new file mode 100644 index 0000000000000000000000000000000000000000..2c0aa56bbb703e87fa1f288f33b86faa37eb5daa GIT binary patch literal 1601 zcmaJ>-**#56#ga+-6SleO@pA-8ns{=u<R%aA%VPn>NRNn7wo7&Ntt8@63Jl-_|yOgX)dAzBnZzb?H-bo>Xc@6I+pyPcF$2FW_7(Zp& zraa9M&6eg?=vQ>=f+1NpZL!>KuL`%uS1t0S%8tRU74Dj9K5#~5)ASf7%jbn?t-9Q_ zz5Er2*9!z}3A-Vi46MWuX*dj1*>G5qy9IS1BkWB1I={j57PlMuk}ZYnb~{qk&wXWx zjx-&c;F!TMv2#DezN+L#tHL`2LW!!=bq%p(D$4N+5t>)fIwo*Z$3Yw-l(UW_J?ZjJ zMaZU8_mbmSh@qh46h6>#8fP>t>i7_6H57GxgmW=0sm1deF6b!XqK=PI)=<&0j7u?G zW|;YZ{yILvNlNODED@KGhmsC6Em3rAgUhR?Y?9?kZc8f10V-uEqgCmec7t-bw=O)xHG`C@f<7btG-M*=Tl1u7 z6CtN739}zBK6^EN3-XGgL)L_!|=>%H&%b^q^7?^f?7 z8UHS17{iI|Zce*BBT=UU;=}ZaOh=KmY?YG{Ky>|LM7P=zq8?BgPY50PkPuX!=T{=`R*|u|Z!GMV8}bZotgUs# zi12Hn_)DwTg&_;!%nu-n+_I{s6a@{}7!L2!H;UWPdl{lK(0~kevm~`OP|Ko{V3J1F z=4v#L&_A8K50;zWKqNQ4g)v|Q(YrzP6pblFX}m?__lV;MOyNhQ$@5%)FAk8UzO-rx zgv{_fUKpJ42cZ!j7Vlxt(M^o!{z7yM8nB5N*%9)^t;w;+&2JwdF%+{mi1{6{%CSxC zyGwYgPcKlj9U}(7j6%U}vVX!Xex|iwY4sNra0h4bTfi_wu?6BijTZy1i%+>O;w3_0 tc$qLXM84LbM=3Z%(+FO{Rr)7r`BQw36_PVc^E9m=Cf|`@d?Og&eF9!|sAB*C literal 0 HcmV?d00001 diff --git a/lesson05/out/production/lesson05/Geekbrains/Stage.class b/lesson05/out/production/lesson05/Geekbrains/Stage.class new file mode 100644 index 0000000000000000000000000000000000000000..f3bbd8a29ca4cfe9c9ddfb248d76317719d2c9bc GIT binary patch literal 471 zcmZutyH3ME5S+6w4mKu%Bs?q1go2b5K{P=iqyR-w`m=L#E|@bqU-$wFJ_jTuBnm!& zk3y^s5+P9BKIV33cjx`%^$oxQb^>s0_;9gV#a0#D3|=aAVkZpjjA3~!^Vq0ct1`{d z7)-^T=%zv^-Jvx~Cq1e^R9e|12DjZAG4OsimJIcQ((+<<6G?L=qLh%vAd5vh5=IsI zH^}Wo<;CBrl-H3FO6SBZ5=q3hMB3x|@vU~}zXhBmV`#SLDf+_nie-XfHZ!q2QN;rO zInnPI7liN;gs5VPVRdmbK|fbsMpGGEzDoje63ii6fkzQ9y2-orhzukZMP2fYd}Z$i u?1=&gAz7~k@3BI0_*H-!>XgwitdafQ{0!%Dq50u&Gbi29EJ<2r_4+3rSXxa0 literal 0 HcmV?d00001 diff --git a/lesson05/out/production/lesson05/Geekbrains/Tunnel.class b/lesson05/out/production/lesson05/Geekbrains/Tunnel.class new file mode 100644 index 0000000000000000000000000000000000000000..5bdb667b4c8aeb52da0e6dd31d37174600ebbd80 GIT binary patch literal 2141 zcmah~-E$LF6#s3ScGIxXHc+5QF-p-ie8dkFq=?e;(bl%0si2_X?dF$s5bo_uqOD$5~ecJpN{uPeD-Gq|TFis}-?mg$+bAIP{&b{~Ve;1bk z>_a(@jo8_WPV7oh@KW&gaxlCS$E(=eir4UZoOb&YP;elQJ{$}bZzd24mizEl9B<=r z0!=ueVjzxo98qyJjs%VbhR0MKS23ud$t{)?Bu6I2MUg3chMCcAOD{W)w7g7K7DcIG zJF-tf%R$33yh94Mr~c2l_mqO@fSr>H+C~gZj+KiO(is;MCMAgxTNmaj;TXZXCX9Lo z!&R_;9sOLF zCC{)edg!bo4o&LiimssjNxur#W<8-#jfzr;PQ{Rdc-AgEx;$nCDYT9f;GTdn4P6-4 z@D4`ksNc3d*KCxH%TSw|K-nB zE>*sucviutqL`8c>@DG)HoOAATu)dYtKOL!>a8nK)^iLi&#JA-NmqA_u!uq5JWgoY zq)Nq8+m?0noaw{*g|gu=AwoaHOzZqiyPhmkVVAw-E-~!PNh0tVM2aGDtgEAjji*4( zOK(gR>2X7R;8_wNS$^d3km3ij6y zRan(pdaDy|7_3^Rm8gla6y#u90lf_zv4pC4#LH&Fec<1!Tqd;p%NRpkF{YX=Ntp}T z<3Xrnk4+&370s?GB`=X^YB*?(ZS;1Jo)&|4pwERTeYS*gY*Hwmns5cx{OHg)?9Z*OioiSD$vxNA+M1 z3M*$yx2L+XZ#6r0k`)`rr%SSd`Pn-A6BCnC_xkD!RdX>QOfzeEvQGtjZO5wo8ev;; z)>lBO<$xrggpGV46#jX+aE$P~3tKoo!`p59q#&rm-Q{~oyA42r#WBYe3f}#!(Ch_$=_mul>Ql#m}cbj{6CNFtjqQA zt0%0`%rdbv*nt;F=!=ZpftDWjdHWd^sm^{Ci70{fQV~HKCC+ggT5w>q=)1YzLYI3e O%Y@?_;dm$<`~L%(E=tn? literal 0 HcmV?d00001 diff --git a/lesson05/src/Geekbrains/Main.java b/lesson05/src/Geekbrains/Main.java new file mode 100644 index 0000000..ce8abdd --- /dev/null +++ b/lesson05/src/Geekbrains/Main.java @@ -0,0 +1,193 @@ +package Geekbrains; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.concurrent.*; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class Main { + private static int CARS_COUNT = 4; + private static Lock lock =new ReentrantLock(); + + public static void main(String[] args) throws BrokenBarrierException, InterruptedException { + // Все участники должны стартовать одновременно, несмотря на разное время подготовки. == CyclicBarrier + // + // В тоннель не может одновременно заехать больше половины участников (условность). == Semaphore + //Попробуйте все это синхронизировать. + //Первый участник, пересекший финишную черту, объявляется победителем (в момент пересечения этой самой черты). == ? + //Победитель должен быть только один (ситуация с 0 или 2+ победителями недопустима). == ? + //Когда все завершат гонку, нужно выдать объявление об окончании. == ? + //Можно корректировать классы (в том числе конструктор машин) и добавлять объекты классов из пакета java.util.concurrent. + + //----------Классы синхронизации---------- + // для training + CyclicBarrier cb = new CyclicBarrier(CARS_COUNT); + // для гонка началась + final CountDownLatch cdl = new CountDownLatch(CARS_COUNT); + // для тоннелeй + Semaphore smp = new Semaphore(CARS_COUNT/2); + // для финиша + + + // для гонка закончилась + final CountDownLatch cdlFin = new CountDownLatch(CARS_COUNT); + + + System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Подготовка!!!"); + //Создается новая трасса (длинна, тунели, дорога) + Race race = new Race(new Road(60), new Tunnel(smp), new Road(40)); + //Укороченная гонка для тестов + //Race race = new Race(new Tunnel(smp)); + Car[] cars = new Car[CARS_COUNT]; + // участники ( гонка? рандомная скорость) + for (int i = 0; i < cars.length; i++) { + cars[i] = new Car(race, 20 + (int) (Math.random() * 10),lock, cdlFin); + + } + + + // потоки участников + // 1 этап: подготовка + for (int i = 0; i < cars.length; i++) { + final int w = i; + new Thread(() -> { + // ожидаем всех на подготовке + cars[w].training(cb); + cdl.countDown(); + }).start(); + } + // ожидаем всех у линии старта + cdl.await(); + System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Гонка началась!!!"); + + // 2 этап: основная часть - гонка + for (int i = 0; i < cars.length; i++) { + new Thread(cars[i]).start(); + } + cdlFin.await(); + System.out.println("ВАЖНОЕ ОБЪЯВЛЕНИЕ >>> Гонка закончилась!!!"); + + } // psvm end + } // main class ends + + + +class Car implements Runnable { + private static int CARS_COUNT; + private Race race; + private int speed; + private String name; + + // добавленные поля + CountDownLatch cdlFin; + Lock lock; + + // + + public String getName() { + return name; + } + public int getSpeed() { + return speed; + } + public Car(Race race, int speed, Lock lock, CountDownLatch cdlFin) { + this.race = race; + this.speed = speed; + CARS_COUNT++; + this.name = "Участник #" + CARS_COUNT; + + this.lock=lock; + this.cdlFin = cdlFin; + } + + @Override + public void run() { + for (int i = 0; i < race.getStages().size(); i++) { + race.getStages().get(i).go(this); + + } + if (lock.tryLock()) { + System.out.println("Участник #" + " " + name + " ------------------win------------------"); + } + // не убираем лок, тк только один поток должен победить + //lock.unlock(); + + cdlFin.countDown(); + } + + public void training(CyclicBarrier cyclicBarrier){ + try { + System.out.println(this.name + " готовится"); + Thread.sleep(500 + (int)(Math.random() * 800)); + System.out.println(this.name + " готов"); + cyclicBarrier.await(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} + + +abstract class Stage { + protected int length; + protected String description; + public String getDescription() { + return description; + } + public abstract void go(Car c); +} +class Road extends Stage { + public Road(int length) { + this.length = length; + this.description = "Дорога " + length + " метров"; + } + @Override + public void go(Car c) { + try { + System.out.println(c.getName() + " начал этап: " + description); + Thread.sleep(length / c.getSpeed() * 1000); + System.out.println(c.getName() + " закончил этап: " + description); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} +class Tunnel extends Stage { + Semaphore smp; + public Tunnel(Semaphore smp) { + this.length = 80; + this.description = "Тоннель " + length + " метров"; + // Semaphore + this.smp = smp; + } + + @Override + public void go(Car c) { + try { + try { + if (!smp.tryAcquire()){ + System.out.println(c.getName() + " готовится к этапу(ждет): " + description); + // Semaphore + smp.acquire();} + System.out.println(c.getName() + " начал этап: " + description); + Thread.sleep(length / c.getSpeed() * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + System.out.println(c.getName() + " закончил этап: " + description); + } + } catch (Exception e) { + e.printStackTrace(); + } + // Semaphore + smp.release(); + } +} + class Race { + private ArrayList stages; + public ArrayList getStages() { return stages; } + public Race(Stage... stages) { + this.stages = new ArrayList<>(Arrays.asList(stages)); + } + }