Giriş
Akymlar gyzykly zat. Öňki synlarda, köp okamagy amala aşyrmak üçin bar bolan gurallara seredipdik. Başga näme gyzykly edip biljekdigimizi göreliň. Şu wagt biz köp zady bilýäris. Mysal üçin, “
Java-ny sapak bilen zaýalap bilmersiňiz: I bölüm - sapaklar ” -dan, bir sapagyň sapakdygyny bilýäris. Bir sapagyň käbir meseläni ýerine ýetirýändigini bilýäris. Işimiziň () işlemegini islesek
run
, sapagy belli bir derejede kesgitlemeli
Runnable
.
Rememberatda saklamak üçin Tutorialspoint Java Online Compiler ulanyp bileris :
public static void main(String []args){
Runnable task = () -> {
Thread thread = Thread.currentThread();
System.out.println("Hello from " + thread.getName());
};
Thread thread = new Thread(task);
thread.start();
}
Gulp ýaly düşünjämiziň bardygyny hem bilýäris.
Bu hakda " Java-y sapak bilen zaýalap bilmersiňiz: II bölüm - Sinhronizasiýa " -da okaýarys . Bir sapak gulpy tutup biler, soňra gulpy eýelemäge synanyşýan başga bir sapak gulpuň erkin bolmagyna garaşmaga mejbur bolar:
import java.util.concurrent.locks.*;
public class HelloWorld{
public static void main(String []args){
Lock lock = new ReentrantLock();
Runnable task = () -> {
lock.lock();
Thread thread = Thread.currentThread();
System.out.println("Hello from " + thread.getName());
lock.unlock();
};
Thread thread = new Thread(task);
thread.start();
}
}
Bu gyzykly başga näme edip biljekdigimiz hakda gürleşmegiň wagty geldi diýip pikir edýärin.
Semaphores
Bir wagtyň özünde näçe sapagyň işläp biljekdigine gözegçilik etmegiň iň ýönekeý serişdesi ýarymgoragdyr. Demirýolda bolşy ýaly. Greenaşyl çyra ýakylýar - edip bilersiňiz. Gyzyl çyra ýakylýar - garaşýarys. Aarym ýarymdan nämä garaşýarys? Rugsatlar. Iňlis dilinde rugsat - rugsat. Rugsat almak üçin ony iňlis dilinde aljak bolmaly. Rugsat indi zerur däl bolanda, ony bermeli, ýagny boşatmaly ýa-da iňlis dilinde çykjak ondan dynmaly. Onuň nähili işleýändigini göreliň. Synpy import etmeli bolarys
java.util.concurrent.Semaphore
. Mysal:
public static void main(String[] args) throws InterruptedException {
Semaphore semaphore = new Semaphore(0);
Runnable task = () -> {
try {
semaphore.acquire();
System.out.println("Finished");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(task).start();
Thread.sleep(5000);
semaphore.release(1);
}
Görşümiz ýaly, iňlis sözlerini ýatda saklap, semaforyň nähili işleýändigine düşünýäris. Gyzykly tarapy, esasy şert, ýarym “hasap” -da oňyn mukdarda rugsat bolmaly. Şonuň üçin ony minus bilen başlap bilersiňiz. 1-den köp talap edip bilersiňiz.
CountDownLatch
Indiki mehanizm
CountDownLatch
. Iňlis dilinde “CountDown” hasaplaýyş, “Latch” bolsa bolt ýa-da berkitme. .Agny, terjime etsek, bu sanalýan berkitme. Bu ýerde synpyň degişli importy gerek
java.util.concurrent.CountDownLatch
. Her kim başlangyç setirde ýygnanýan we her kim taýyn bolanda rugsat berilýär we her kim bir wagtda başlaýar. Mysal:
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(3);
Runnable task = () -> {
try {
countDownLatch.countDown();
System.out.println("Countdown: " + countDownLatch.getCount());
countDownLatch.await();
System.out.println("Finished");
} catch (InterruptedException e) {
e.printStackTrace();
}
};
for (int i = 0; i < 3; i++) {
new Thread(task).start();
}
}
Iňlis dilinde garaşmak - garaşmak. .Agny, ilki bilen gürleýäris
countDown
. “Google Translator” -yň aýdyşy ýaly, sanamak “sanlary tersine nol sanamak”, ýagny san nolyna öwürmek, maksady nola çenli hasaplamak. Soň bolsa diýýäris
await
- ýagny, hasap bahasy nola öwrülýänçä garaşyň. Şeýle hasaplaýjynyň bir gezek ulanylmagy gyzykly. JavaDoc-da aýdylyşy ýaly - "Haçan-da sapaklar bu görnüşde birnäçe gezek sanalmaly bolsa," CyclicBarrier "-i ulanmaly", ýagny gaýtadan ulanyp boljak sanama zerur bolsa, başga bir opsiýa ulanmaly
CyclicBarrier
.
CyclicBarrier
Adyndan görnüşi ýaly,
CyclicBarrier
bu aýlawly päsgelçilikdir. Synpy import etmeli bolarys
java.util.concurrent.CyclicBarrier
. Bir mysala seredeliň:
public static void main(String[] args) throws InterruptedException {
Runnable action = () -> System.out.println("На старт!");
CyclicBarrier berrier = new CyclicBarrier(3, action);
Runnable task = () -> {
try {
berrier.await();
System.out.println("Finished");
} catch (BrokenBarrierException | InterruptedException e) {
e.printStackTrace();
}
};
System.out.println("Limit: " + berrier.getParties());
for (int i = 0; i < 3; i++) {
new Thread(task).start();
}
}
Görşüňiz ýaly, sapak ýerine ýetirilýär
await
, ýagny garaşýar. Bu ýagdaýda päsgelçiligiň gymmaty peselýär.
berrier.isBroken()
Hasaplama nola ýetende päsgelçilik bozuldy () hasaplanýar . Päsgelçiligi täzeden dikeltmek üçin jaň etmeli
berrier.reset()
, ýitirim bolan
CountDownLatch
.
Çalyşýan
Indiki bejeriş serişdesi
Exchanger
. Iňlis dilinden alyş-çalyş alyş-çalyş ýa-da alyş-çalyş hökmünde terjime edilýär. A
Exchanger
alyş-çalyş, ýagny alyş-çalyş edýän zat. Simpleönekeý bir meselä seredeliň:
public static void main(String[] args) {
Exchanger<String> exchanger = new Exchanger<>();
Runnable task = () -> {
try {
Thread thread = Thread.currentThread();
String withThreadName = exchanger.exchange(thread.getName());
System.out.println(thread.getName() + " обменялся с " + withThreadName);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(task).start();
new Thread(task).start();
}
Bu ýerde iki sapak açýarys. Olaryň her biri alyş-çalyş usulyny ýerine ýetirýär we alyş-çalyş usulyny ýerine ýetirmek üçin başga bir sapaga garaşýar. Şeýlelik bilen, sapaklar geçen argumentleri öz aralarynda alyş-çalyş eder. Gyzykly zat. Ol size hiç zady ýatlatmaýarmy? We
SynchronousQueue
a
cachedThreadPool
. Aýdyňlyk üçin bir mysal:
public static void main(String[] args) throws InterruptedException {
SynchronousQueue<String> queue = new SynchronousQueue<>();
Runnable task = () -> {
try {
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(task).start();
queue.put("Message");
}
Mysal täze sapak açmak bilen bu sapagyň garaşmak tertibine geçjekdigini görkezýär, sebäbi nobat boş bolar. Soň bolsa
main
sapak “Habar” tekstine nobata durar. Şol bir wagtyň özünde, bu tekst elementini nobatdan alýança gerekli wagt saklanar. Bu mowzukda "
SynchronousQueue Vs Exchanger " -i hem okap bilersiňiz.
Phaser
Netijede, iň süýji zat -
Phaser
. Synpy import etmeli bolarys
java.util.concurrent.Phaser
. Simpleönekeý bir meselä seredeliň:
public static void main(String[] args) throws InterruptedException {
Phaser phaser = new Phaser();
phaser.register();
System.out.println("Phasecount is " + phaser.getPhase());
testPhaser(phaser);
testPhaser(phaser);
testPhaser(phaser);
Thread.sleep(3000);
phaser.arriveAndDeregister();
System.out.println("Phasecount is " + phaser.getPhase());
}
private static void testPhaser(final Phaser phaser) {
phaser.register();
new Thread(() -> {
String name = Thread.currentThread().getName();
System.out.println(name + " arrived");
phaser.arriveAndAwaitAdvance();
System.out.println(name + " after passing barrier");
}).start();
}
Mysal,
Phaser
bellige alyşlaryň sany päsgelçilige gelenleriň sanyna gabat gelende, 'a' ulanylanda päsgelçiligiň bozulýandygyny görkezýär.
Phaser
Makalada "
Täze Phaser sinhronizator " merkezinden has giňişleýin maglumat alyp bilersiňiz .
Netijeler
Mysallardan görnüşi ýaly, sapaklary sinhronlamagyň dürli ýollary bar. Öň köp okamak hakda bir zady ýada saljak boldum, öňki bölümleri peýdaly bolar diýip umyt edýärin. Köp okalmagyň ýolunyň "Praktikada Java ylalaşygy" kitabyndan başlanýandygyny aýdýarlar. 2006-njy ýylda çykan hem bolsa, adamlar bu kitabyň düýpden esasdygyny we henizem bir nokat goýýandygyny aýdýarlar. Mysal üçin, çekişmeleri şu ýerden okap bilersiňiz: "
Praktikada Java ylalaşygy henizem hereket edýärmi? ". Ara alyp maslahatlaşmadan baglanyşyklary okamak hem peýdalydyr.
Mysal üçin, " Gowy esaslandyrylan Java dörediji " kitabyna baglanyşyk bar , onda "
4-nji bap. Häzirki zaman ylalaşygy " -na üns bermeli . Şol bir mowzukda başga bir syn bar: "
Java 8-iň döwründe praktikada Java-yň pul birligi barmy ?" Mundan başga-da, mowzuga düşünmek üçin başga näme okamalydygy barada maslahatlar bar.
Ondan soň " OCA OCP JavaSE 8 Programmer tejribe synaglary " ýaly ajaýyp kitaba has içgin seredip bilersiňiz . Ikinji bölüm, ýagny OCP bilen gyzyklanýarys. "∫" -da synaglar bar. Bu kitapda düşündirişler bilen soraglar we jogaplar bar. Mysal üçin:
Köpler munuň diňe usullary ýatda saklamakdygyny aýdyp bilerler. Bir tarapdan, hawa. Başga bir tarapdan, bu soraga
ExecutorService
munuň “kämilleşdiriş” görnüşidigini ýadyňyzdan çykarmak bilen jogap berip bilersiňiz
Executor
. Diňe
Executor
sapaklary döretmek usulyny gizlemek üçin niýetlenendir, ýöne olary ýerine ýetirmegiň esasy usuly däl, ýagny täze sapakda işlemek
Runnable
. Şonuň üçin
execute(Callable)
ýok, sebäbi yzyna gaýdyp
ExecutorService
boljak
Executor
usullary goşdular . Görşüňiz ýaly, usullaryň sanawyny ýatda saklap bileris, ýöne synplaryň tebigatyny bilsek çaklamak has aňsat. Garaz, mowzukda goşmaça materiallar:
submit
Future
# Wiaçeslaw
GO TO FULL VERSION