JavaRush /Java Blog /Random-TK /Java-ny sapak bilen zaýalap bilmersiňiz: VI bölüm - Päsge...
Viacheslav
Dereje

Java-ny sapak bilen zaýalap bilmersiňiz: VI bölüm - Päsgelçilige!

Toparda çap edildi

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 CompilerJava-ny sapak bilen zaýalap bilmersiňiz: VI bölüm - Päsgelçilige!  - 1 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, CyclicBarrierbu 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 Exchangeralyş-ç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 SynchronousQueuea 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 mainsapak “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();
        // Вызывая метод register, мы регистрируем текущий поток (main) How участника
        phaser.register();
        System.out.println("Phasecount is " + phaser.getPhase());
        testPhaser(phaser);
        testPhaser(phaser);
        testPhaser(phaser);
        // Через 3 секунды прибываем к барьеру и снимаемся регистрацию. Кол-во прибывших = кол-во регистраций = пуск
        Thread.sleep(3000);
        phaser.arriveAndDeregister();
        System.out.println("Phasecount is " + phaser.getPhase());
    }

    private static void testPhaser(final Phaser phaser) {
        // Говорим, что будет +1 участник на Phaser
        phaser.register();
        // Запускаем новый поток
        new Thread(() -> {
            String name = Thread.currentThread().getName();
            System.out.println(name + " arrived");
            phaser.arriveAndAwaitAdvance(); //threads register arrival to the phaser.
            System.out.println(name + " after passing barrier");
        }).start();
    }
Mysal, Phaserbellige alyşlaryň sany päsgelçilige gelenleriň sanyna gabat gelende, 'a' ulanylanda päsgelçiligiň bozulýandygyny görkezýär. PhaserMakalada " 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: Java-ny sapak bilen zaýalap bilmersiňiz: VI bölüm - Päsgelçilige!  - 3Köpler munuň diňe usullary ýatda saklamakdygyny aýdyp bilerler. Bir tarapdan, hawa. Başga bir tarapdan, bu soraga ExecutorServicemunuň “kämilleşdiriş” görnüşidigini ýadyňyzdan çykarmak bilen jogap berip bilersiňiz Executor. Diňe Executorsapaklary 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 ExecutorServiceboljak Executorusullary 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: submitFuture # Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION