Giriş
Köp okamak Java-da ilkinji günlerinden bäri gurlupdyr. Geliň, köp okamagyň nämedigine gysga göz aýlalyň.
Oracle-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]);
}
}
args
programma 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
Kodumyzda 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) {
}
}
}
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ň:
Birinji 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
main
giriş nokady ýa-da "giriş nokady" diýilýär. Usul elmydama Java Wirtual Machine (JVM) programmamyzy ýerine ýetirip biler ýaly
main
bolmaly . 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 айдипроцесса
Gyzykly 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.
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
run
we 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.
start
JVM-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?
run
Jogap, biziň ýok edýän usulymyzda :
public void run() {
if (target != null) {
target.run();
}
}
Ine , synpyň mysalyny döredenimizde, mowzuga geçip biljek
target
kä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,
Runnable
Java 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
GO TO FULL VERSION