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

Java-ny sapak bilen zaýalap bilmersiňiz: I bölüm - sapaklar

Toparda çap edildi

Giriş

Köp okamak Java-da ilkinji günlerinden bäri gurlupdyr. Geliň, köp okamagyň nämedigine gysga göz aýlalyň. Java-ny sapak bilen ýok edip bilmersiňiz: I bölüm - Saplar - 1Oracle-dan resmi sapagy başlangyç nokat hökmünde alalyň: " Sapak:" Salam Dünýä! "Programmasy ". “Salam World” programmamyzyň koduny aşakdakylara azajyk üýtgedeliň:
class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello, " + args[0]);
    }
}
argsprogramma başlanda geçen giriş parametrleriniň massiwidir. Geliň, bu kody synpyň adyna we giňeltmesine laýyk gelýän bir faýlda saklalyň .java. Javac kömekçi programmasyny ulanyp düzeliň : javac HelloWorldApp.java Ondan soň kodumyzy käbir parametrler bilen çagyryň, mysal üçin Roger: java HelloWorldApp Roger Java-ny sapak bilen ýok edip bilmersiňiz: I bölüm - Saplar - 2Kodumyzda indi düýpli kemçilik bar. Haýsydyr bir argumentden geçmesek (meselem, “HelloWorldApp” java ýerine ýetiriň), ýalňyşlyk alarys:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at HelloWorldApp.main(HelloWorldApp.java:3)
Kadadan çykma (ýagny ýalňyşlyk) atly sapakda ýüze çykdy main. Java-da haýsydyr bir sapak barmy? Ine, syýahatymyz şu ýerden başlaýar.

Java we sapaklar

Bir sapagyň nämedigine düşünmek üçin Java programmasynyň nädip işe girizilendigine düşünmeli. Kodymyzy aşakdaky ýaly üýtgedeliň:
class HelloWorldApp {
    public static void main(String[] args) {
		while (true) {
			//Do nothing
		}
	}
}
Indi javac ulanyp ýene bir gezek düzeliň. Ondan soň, amatly bolmak üçin Java kodumyzy aýratyn penjirede işlederis. Windows-da şeýle edip bilersiňiz : start java HelloWorldApp. Indi, jps kömekçi programmasyny ulanyp , Java-yň bize näme maglumat berjekdigini göreliň: Java-ny sapak bilen ýok edip bilmersiňiz: I bölüm - Saplar - 3Birinji san, PID ýa-da Prosess ID, prosesi kesgitleýji. Bu proses näme?
Процесс — это совокупность codeа и данных, разделяющих общее виртуальное addressное пространство.
Amallaryň kömegi bilen dürli programmalaryň ýerine ýetirilmegi biri-birinden üzňeleşdirilýär: her bir programma beýleki programmalara päsgel bermezden öz ýat meýdanyny ulanýar. Makalany has jikme-jik okamagyňyzy maslahat berýärin: " https://habr.com/post/164487/ ". Bir proses sapaksyz bolup bilmez, şonuň üçin bir proses bar bolsa, iň bolmanda bir sapak bar. Java-da bu nähili bolup geçýär? Java programmasyny işledenimizde, onuň ýerine ýetirilişi başlaýar main. Programmany girizýäris, şonuň üçin bu ýörite usula maingiriş nokady ýa-da "giriş nokady" diýilýär. Usul elmydama Java Wirtual Machine (JVM) programmamyzy ýerine ýetirip biler ýaly mainbolmaly . Has giňişleýin maglumat üçin public static void" Näme üçin Java esasy usuly statik? " Görnüşi ýaly, java işlediji (java.exe ýa-da javaw.exe) ýönekeý programma (ýönekeý C programmasy): aslynda JVM bolan dürli DLL-leri ýükleýär. Java işlediji, Java Native Interface (JNI) jaňlarynyň belli bir toplumyny edýär. JNI, Java Wirtual Machine we C ++ dünýäsini köpri edýän mehanizmdir. Görnüşi ýaly, işlediji JVM däl-de, onuň ýükleýjisi. JVM-ni başlamak üçin ýerine ýetirmeli dogry buýruklary bilýär. JNI jaňlaryny ulanyp, ähli zerur gurşawy nädip tertipleşdirmelidigini bilýär. Daşky gurşawyň bu guramasy, adatça diýilýän esasy sapagyň döredilmegini hem öz içine alýar main. Java prosesinde haýsy sapaklaryň ýaşaýandygyny has anyk görmek üçin JDK-a girýän jvisualvm programmasyny ulanýarys. Amalyň pidini bilip, derrew maglumatlary açyp bileris: jvisualvm --openpid айдипроцесса Java-ny sapak bilen ýok edip bilmersiňiz: I bölüm - Saplar - 4Gyzykly tarapy, bu sapak üçin bölünen ýadyň her bir aýratyn ýeri bar. Bu ýat gurluşyna stak diýilýär. Stak çarçuwalardan durýar. Çarçuwa, usuly, ýerine ýetiriş nokadyny çagyrmagyň nokadydyr. Çarçuwany StackTraceElement hökmünde hem görkezip bolar ( StackTraceElement üçin Java API serediň ). Her sapak üçin bölünen ýat hakda has giňişleýin maglumaty şu ýerden okap bilersiňiz . Java API- e göz aýlasak we Söz sözüni gözlesek, java.lang.Thread synpynyň bardygyny göreris . Hut şu synp Java-da bir akymy aňladýar we şonuň bilen işlemeli bolýarys. Thread'ом Java не испортишь: Часть I — потоки - 5

java.lang.Thread

Java-da bir sapak synpyň mysaly hökmünde görkezilýär java.lang.Thread. Java-da sapak synpynyň mysallarynyň özleri däldigine derrew düşünmelidiris. Bu, JVM we operasiýa ulgamy tarapyndan dolandyrylýan pes derejeli sapaklar üçin diňe bir görnüş. main“Java” işledijisini ulanyp, JVM-i işe girizenimizde, ady we başga-da birnäçe hyzmat sapaklary bilen esasy sapak döredýär . Sapak synpynyň JavaDoc-da aýdylyşy ýaly: When a Java Virtual Machine starts up, there is usually a single non-daemon thread 2 görnüşli sapak bar: daemon we daemon däl. Daemon sapaklary fonda käbir işleri ýerine ýetirýän fon sapaklary (hyzmat sapaklary). Bu gyzykly adalga, "jynlar" hakda Wikipediýa makalasynda has köp okap bilersiňiz "Makswelliň jyny " hakda . Resminamalarda aýdylyşy ýaly, JVM programmany (prosesi) ýerine ýetirmegi dowam etdirýär:
  • “Runtime.exit ” usuly diýilmeýär
  • Daemon däl sapaklaryň hemmesi öz işini tamamlady (ýalňyşsyz hem, kadadan çykmalar bilen)
Şonuň üçin möhüm jikme-jiklik: daemon sapaklary ýerine ýetirilýän islendik buýrukda ýatyrylyp bilner. Şonuň üçin olardaky maglumatlaryň bitewiligi kepillendirilmeýär. Şonuň üçin daemon sapaklary käbir hyzmat meselelerine laýyk gelýär. Mysal üçin, Java-da Zibil ýygnaýjy (GC) bilen baglanyşykly gutarnykly usullary ýa-da sapaklary gaýtadan işlemek üçin jogapkär bir sapak bar. Her sapak käbir topara degişlidir ( ThreadGroup ). Toparlar birek-birege girip, käbir iýerarhiýany ýa-da gurluşy emele getirip bilerler.
public static void main(String []args){
	Thread currentThread = Thread.currentThread();
	ThreadGroup threadGroup = currentThread.getThreadGroup();
	System.out.println("Thread: " + currentThread.getName());
	System.out.println("Thread Group: " + threadGroup.getName());
	System.out.println("Parent Group: " + threadGroup.getParent().getName());
}
Toparlar akymlary dolandyrmagy tertipleşdirmäge we olary yzarlamaga mümkinçilik berýär. Toparlardan başga-da, sapaklaryň öz kadadan çykma usuly bar. Bir mysala seredeliň:
public static void main(String []args) {
	Thread th = Thread.currentThread();
	th.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
		@Override
		public void uncaughtException(Thread t, Throwable e) {
			System.out.println("An error occurred: " + e.getMessage());
		}
	});
    System.out.println(2/0);
}
Nula bölmek, işleýji tarapyndan tutuljak ýalňyşlyga sebäp bolar. Işleýjini özüňiz görkezmeseňiz, deslapky işleýjiniň ýerine ýetirilişi işlär, bu bolsa StdError-da ýalňyşlyk sanawyny görkezer. Synda has köp okap bilersiňiz http://pro-java.ru/java-dlya-opytnyx/obrabotchik-neperexvachennyx-isklyuchenij-java/ "Mundan başga-da, sapak ileri tutulýar. Ileri tutulýan ugurlar barada has köp okap bilersiňiz. makala " Köp okalmakda Java sapagyň ähmiýeti ".

Bir sapak döretmek

Resminamalarda aýdylyşy ýaly, sapak döretmegiň 2 usuly bar. Birinjisi, mirasdüşeriňizi döretmekdir. Mysal üçin:
public class HelloWorld{
    public static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Hello, World!");
        }
    }

    public static void main(String []args){
        Thread thread = new MyThread();
        thread.start();
    }
}
Görşüňiz ýaly, mesele usulda başlaýar runwe sapak usulda başlaýar start. Bulaşdyrmaly däl, sebäbi ... usuly gönüden-göni işlesek run, täze sapak başlamaz. startJVM-den täze sapak döretmegini soraýan usul . Sapak neslinden bolan opsiýa erbet, sebäbi sapaklary iýerarhiýa girizýäris. Ikinji ýetmezçilik, "Oleeke-täk jogapkärçilik" SOLID ýörelgesini bozup başlaýarys, sebäbi synpymyz bir wagtyň özünde sapagy dolandyrmak we bu sapakda ýerine ýetirilmeli käbir meseleler üçin jogapkär bolýar. Haýsy dogry? runJogap, biziň ýok edýän usulymyzda :
public void run() {
	if (target != null) {
		target.run();
	}
}
Ine , synpyň mysalyny döredenimizde, mowzuga geçip biljek targetkäbirlerimiz . java.lang.RunnableŞonuň üçin muny edip bileris:
public class HelloWorld{
    public static void main(String []args){
        Runnable task = new Runnable() {
            public void run() {
                System.out.println("Hello, World!");
            }
        };
        Thread thread = new Thread(task);
        thread.start();
    }
}
Şeýle hem, RunnableJava 1.8-den bäri işleýän interfeýs. Bu sapaklar üçin meseleler koduny has owadan ýazmaga mümkinçilik berýär:
public static void main(String []args){
	Runnable task = () -> {
		System.out.println("Hello, World!");
	};
	Thread thread = new Thread(task);
	thread.start();
}

Jemi

Şeýlelik bilen, bu hekaýadan akymyň nämedigi, olaryň barlygy we olar bilen haýsy esasy amallary ýerine ýetirip boljakdygy aýdyňdyr diýip umyt edýärin. Indiki bölümde , sapaklaryň biri-biri bilen nähili täsirleşýändigine we durmuş sikliniň nämedigine düşünmelidiris. # Wiaçeslaw
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION