JavaRush /Блоги Java /Random-TG /Шумо наметавонед Java-ро бо ришта вайрон кунед: Қисми I -...
Viacheslav
Сатҳи

Шумо наметавонед Java-ро бо ришта вайрон кунед: Қисми I - Риштаҳо

Дар гурӯҳ нашр шудааст

Муқаддима

Multithreading дар Java аз рӯзҳои аввали худ сохта шудааст. Пас, биёед зуд дида бароем, ки multithreading чист. Шумо наметавонед Java-ро бо ришта вайрон кунед: Қисми I - Threads - 1Биёед дарси расмии Oracle-ро ҳамчун нуқтаи ибтидоӣ гирем: " Дарс: Барномаи "Салом Ҷаҳон! ". Биёед рамзи барномаи Hello World-ро каме ба зерин иваз кунем:
class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello, " + args[0]);
    }
}
argsмассиви параметрҳои воридотӣ аст, ки ҳангоми оғози барнома гузаронида мешавад. Биёед ин codeро ба файле захира кунем, ки номаш ба номи синф ва васеъшавӣ мувофиқат мекунад .java. Биёед бо истифода аз утorтаи javac тартиб диҳем : javac HelloWorldApp.java Пас аз он, рамзи моро бо ягон параметр даъват кунед, масалан, Роҷер: java HelloWorldApp Roger Шумо наметавонед Java-ро бо ришта вайрон кунед: Қисми I - Threads - 2Рамзи мо ҳоло як камбудии ҷиддӣ дорад. Агар мо ягон далелро нагузаронем (яъне танҳо java HelloWorldApp-ро иҷро кунем), мо хатогиро мегирем:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at HelloWorldApp.main(HelloWorldApp.java:3)
Истисно (яъне хато) дар ришта бо номи main. Маълум мешавад, ки дар Java як навъ риштаҳо вуҷуд доранд? Дар ин ҷо сафари мо оғоз мешавад.

Java ва риштаҳо

Барои фаҳмидани он ки ришта чист, шумо бояд фаҳмед, ки чӣ гуна барномаи Java оғоз мешавад. Биёед codeи худро ба таври зерин тағир диҳем:
class HelloWorldApp {
    public static void main(String[] args) {
		while (true) {
			//Do nothing
		}
	}
}
Акнун биёед онро бо истифода аз javac дубора тартиб диҳем. Минбаъд, барои роҳат, мо рамзи Java-и худро дар равзанаи алоҳида иҷро мекунем. Дар Windows шумо метавонед инро чунин иҷро кунед: start java HelloWorldApp. Акнун, бо истифода аз утorтаи jps , биёед бубинем, ки Java ба мо чӣ маълумот медиҳад: Шумо наметавонед Java-ро бо ришта вайрон кунед: Қисми I - Threads - 3Рақами аввал PID ё ID Process, идентификатори раванд аст. Раванд чист?
Процесс — это совокупность codeа и данных, разделяющих общее виртуальное addressное пространство.
Бо ёрии процессхо ичрои программахои гуногун аз хамдигар чудо карда мешавад: хар як замима майдони хотираи худро бе дахолат ба дигар программахо истифода мебарад. Ман ба шумо маслиҳат медиҳам, ки мақоларо муфассалтар хонед: " https://habr.com/post/164487/ ". Раванд бидуни ришта вуҷуд дошта наметавонад, бинобар ин, агар раванд вуҷуд дошта бошад, ҳадди аққал як ришта дар он мавҷуд аст. Ин дар Java чӣ гуна рӯй медиҳад? Вақте ки мо барномаи Java-ро иҷро мекунем, иҷрои он бо main. Мо як навъ ба барнома ворид мешавем, бинобар ин ин усули махсус mainнуқтаи воридшавӣ ё "нуқтаи вуруд" номида мешавад. Усули mainҳамеша бояд public static voidтавре бошад, ки мошини виртуалии Java (JVM) ба иҷрои барномаи мо шурӯъ кунад. Барои тафсилоти бештар нигаред ба " Чаро усули асосии Java статикӣ аст? ". Маълум мешавад, ки Java launcher (java.exe ё javaw.exe) як барномаи оддӣ аст (барномаи оддии C): он DLL-ҳои гуногунро бор мекунад, ки воқеан JVM мебошанд. Оғозкунандаи Java маҷмӯи мушаххаси зангҳои Java Native Interface (JNI) месозад. JNI механизмест, ки ҷаҳони мошини виртуалии Java ва ҷаҳони C++-ро мепайвандад. Маълум мешавад, ки launcher на JVM, балки боркунаки он аст. Он фармонҳои дурустро барои оғоз кардани JVM медонад. Бо истифода аз зангҳои JNI чӣ гуна ташкor ҳама муҳити заруриро медонад. Ин ташкor муҳити атроф эҷоди риштаи асосиро низ дар бар мегирад, ки онро одатан main. Барои равшантар дидани кадом риштаҳо дар раванди java, мо барномаи jvisualvm -ро истифода мебарем , ки ба JDK дохил карда шудааст. Бо донистани pid раванд, мо метавонем маълумотро дар бораи он фавран кушоем: jvisualvm --openpid айдипроцесса Шумо наметавонед Java-ро бо ришта вайрон кунед: Қисми I - Threads - 4Ҷолиб он аст, ки ҳар як ришта дар хотираи барои раванд ҷудошуда майдони алоҳидаи худро дорад. Ин сохтори хотира стек номида мешавад. Стек аз чаҳорчӯба иборат аст. Чаҳорчӯба нуқтаи даъват кардани усул, нуқтаи иҷро мебошад. Чорчӯбро инчунин ҳамчун StackTraceElement муаррифӣ кардан мумкин аст (ниг. Java API барои StackTraceElement ). Шумо метавонед бештар дар бораи хотирае, ки ба ҳар як ришта ҷудо карда шудааст, дар ин ҷо бихонед . Агар мо ба Java API назар кунем ва калимаи Threadро ҷустуҷӯ кунем, мебинем, ки синфи java.lang.Thread мавҷуд аст . Маҳз ҳамин синф ҷараёнро дар Java муаррифӣ мекунад ва мо бояд бо ин кор кунем. Шумо наметавонед Java-ро бо ришта вайрон кунед: Қисми I - Threads - 5

java.lang.Thread

Ришта дар Java ҳамчун намунаи синф муаррифӣ карда мешавад java.lang.Thread. Дарҳол фаҳмидан лозим аст, ки мисолҳои синфи Thread дар Java худи риштаҳо нестанд. Ин танҳо як намуди API барои риштаҳои сатҳи паст аст, ки аз ҷониби JVM ва системаи оператсионӣ идора карда мешаванд. Вақте ки мо JVM-ро бо истифода аз оғозкунандаи java оғоз мекунем, он риштаи асосиро бо ном mainва якчанд риштаҳои дигари хидматӣ эҷод мекунад. Тавре ки дар JavaDoc аз синфи Thread гуфта шудааст: When a Java Virtual Machine starts up, there is usually a single non-daemon thread 2 намуди риштаҳо мавҷуданд: демонҳо ва ғайридемонҳо. Риштаҳои демон риштаҳои заминавӣ (риштаҳои хидматӣ) мебошанд, ки баъзе корҳоро дар замина иҷро мекунанд. Ин истилоҳи ҷолиб истинод ба "девони Максвелл" аст, ки шумо метавонед дар бораи он бештар дар мақолаи Википедиа дар бораи " девҳо " хонед. Тавре ки дар ҳуҷҷатҳо гуфта шудааст, JVM иҷрои барномаро (раванди) идома медиҳад, то:
  • Усули Runtime.exit номида намешавад
  • Ҳама риштаҳои ғайридемон кори худро анҷом доданд (ҳам бе хато ва ҳам ба истиснои партофташуда)
Аз ин рӯ, тафсилоти муҳим: риштаҳои демонро дар ҳама гуна фармонҳои иҷрошаванда қатъ кардан мумкин аст. Аз ин рӯ, тамомияти маълумот дар онҳо кафолат дода намешавад. Аз ин рӯ, риштаҳои демон барои баъзе вазифаҳои хидматӣ мувофиқанд. Масалан, дар Java як ришта мавҷуд аст, ки барои коркарди усулҳои ниҳоӣ ё риштаҳои марбут ба Ҷамъоварии партовҳо (GC) масъул аст. Ҳар як ришта ба ягон гурӯҳ тааллуқ дорад ( ThreadGroup ). Ва гурӯҳҳо метавонанд ба ҳамдигар ворид шуда, баъзе иерархия ё сохторро ташкил кунанд.
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());
}
Гурӯҳҳо ба шумо имкон медиҳанд, ки идоракунии ҷараёнҳоро ба тартиб оред ва онҳоро пайгирӣ кунед. Илова ба гурӯҳҳо, риштаҳо коркардкунандаи истисноии худро доранд. Биёед як мисолро дида бароем:
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);
}
Тақсимшавӣ ба сифр боиси хатогие мегардад, ки коркардкунанда онро дастгир мекунад. Агар шумо коркардкунандаро худатон муайян накунед, татбиқи пешфарз коркардкунанда кор мекунад, ки стеки хатогиҳоро дар StdError намоиш медиҳад. Шумо метавонед бештар дар баррасии http://pro-java.ru/java-dlya-opytnyx/obrabotchik-neperexvachennyx-isklyuchenij-java/ " хонед. Илова бар ин, ришта афзалият дорад. Шумо метавонед бештар дар бораи афзалиятҳо дар мақолаи " Авзалияти риштаи Java дар бисёр риштаҳо ".

Эҷоди ришта

Тавре ки дар ҳуҷҷатҳо гуфта шудааст, мо 2 роҳи эҷоди ришта дорем. Аввал ин аст, ки вориси худро эҷод кунед. Барои намуна:
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();
    }
}
Тавре ки шумо мебинед, вазифа дар усул оғоз карда мешавад runва ришта дар метод start. Онҳо набояд ошуфта шаванд, зеро... агар мо методро runбевосита ба кор андозем, ягон риштаи нав оғоз намешавад. Ин усулест start, ки аз JVM хоҳиш мекунад, ки риштаи нав эҷод кунад. Варианти насли Thread бад аст, зеро мо Thread-ро ба иерархияи синф дохил мекунем. Камбудии дуюм он аст, ки мо ба вайрон кардани принципи «Масъулияти ягона» СОЛИД шуруъ мекунем, зеро синфи мо ҳамзамон барои идоракунии ришта ва барои баъзе вазифаҳое, ки бояд дар ин ришта иҷро карда шаванд, масъул мешавад. Кадомаш дуруст аст? Ҷавоб дар ҳамон усулест run, ки мо онро барҳам медиҳем:
public void run() {
	if (target != null) {
		target.run();
	}
}
Дар ин ҷо targetбаъзеҳо ҳастанд java.lang.Runnable, ки мо метавонем онҳоро ҳангоми сохтани мисоли синф ба Thread гузаронем. Аз ин рӯ, мо метавонем ин корро кунем:
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();
    }
}
Он инчунин Runnableинтерфейси функсионалӣ аз Java 1.8 мебошад. Ин ба шумо имкон медиҳад, ки рамзи вазифаҳоро барои риштаҳо боз ҳам зеботар нависед:
public static void main(String []args){
	Runnable task = () -> {
		System.out.println("Hello, World!");
	};
	Thread thread = new Thread(task);
	thread.start();
}

Ҳамагӣ

Ҳамин тавр, ман умедворам, ки аз ин ҳикоя маълум мешавад, ки ҷараён чист, онҳо чӣ гуна вуҷуд доранд ва бо онҳо чӣ гуна амалиётҳои асосиро иҷро кардан мумкин аст. Дар қисми навбатӣ , фаҳмидани он, ки риштаҳо бо ҳамдигар чӣ гуна муносибат мекунанд ва давраи зиндагии онҳо чӣ гуна аст. #Вячеслав
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION