மல்டித்ரெடிங் மூலம் சிக்கல்கள் தீர்க்கப்படுகின்றன
மல்டித்ரெடிங் உண்மையில் இரண்டு முக்கிய நோக்கங்களை அடைய கண்டுபிடிக்கப்பட்டது:-
ஒரே நேரத்தில் பல விஷயங்களைச் செய்யுங்கள்.
மேலே உள்ள எடுத்துக்காட்டில், வெவ்வேறு நூல்கள் (குடும்ப உறுப்பினர்கள்) இணையாக பல செயல்களைச் செய்தன: அவர்கள் பாத்திரங்களைக் கழுவி, கடைக்குச் சென்று, பொருட்களை பேக் செய்தனர்.
நிரலாக்கத்துடன் மிகவும் நெருக்கமாக தொடர்புடைய ஒரு உதாரணத்தை நாம் வழங்கலாம். பயனர் இடைமுகத்துடன் கூடிய நிரல் உங்களிடம் உள்ளது என்று வைத்துக்கொள்வோம். நிரலில் 'தொடரவும்' என்பதைக் கிளிக் செய்யும் போது, சில கணக்கீடுகள் நடக்க வேண்டும் மற்றும் பயனர் பின்வரும் திரையைப் பார்க்க வேண்டும். இந்த செயல்கள் தொடர்ச்சியாகச் செய்யப்பட்டிருந்தால், பயனர் 'தொடரவும்' பொத்தானைக் கிளிக் செய்த பிறகு நிரல் செயலிழக்கும். நிரல் அனைத்து உள் கணக்கீடுகளையும் செய்து பயனர் இடைமுகம் புதுப்பிக்கப்பட்ட பகுதியை அடையும் வரை பயனர் 'தொடரவும்' பொத்தான் திரையுடன் திரையைப் பார்ப்பார்.
சரி, இரண்டு நிமிடங்கள் காத்திருப்போம் என்று நினைக்கிறேன்!
அல்லது எங்கள் திட்டத்தை மறுவேலை செய்யலாம் அல்லது, புரோகிராமர்கள் சொல்வது போல், அதை 'இணையாக' செய்யலாம். ஒரு இழையில் நமது கணக்கீடுகளைச் செய்து மற்றொரு நூலில் பயனர் இடைமுகத்தை வரைவோம். பெரும்பாலான கணினிகள் இதைச் செய்ய போதுமான ஆதாரங்களைக் கொண்டுள்ளன. நாங்கள் இந்த வழியில் சென்றால், நிரல் செயலிழக்காது மற்றும் பயனர் உள்ளே என்ன நடக்கிறது என்பதைப் பற்றி கவலைப்படாமல் திரைகளுக்கு இடையில் சீராகச் செல்வார். ஒன்று மற்றொன்றில் தலையிடாது :)
-
கணக்கீடுகளை விரைவாகச் செய்யுங்கள்.
இங்கே எல்லாம் மிகவும் எளிமையானது. நமது செயலியில் பல கோர்கள் இருந்தால், மற்றும் இன்று பெரும்பாலான செயலிகள் செய்தால், பல கோர்கள் நமது பணிகளின் பட்டியலை இணையாக கையாள முடியும். வெளிப்படையாக, நாம் 1000 பணிகளைச் செய்ய வேண்டும் மற்றும் ஒவ்வொன்றும் ஒரு வினாடி எடுத்தால், ஒரு கோர் 1000 வினாடிகளில் பட்டியலை முடிக்க முடியும், இரண்டு கோர்கள் 500 வினாடிகளில், மூன்று 333 வினாடிகளுக்கு சற்று அதிகமாகும்.
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("I'm Thread! My name is " + getName());
}
}
த்ரெட்களை உருவாக்க மற்றும் இயக்க, நாம் ஒரு வகுப்பை உருவாக்க வேண்டும், அதை java.lang ஐப் பெற வேண்டும் . நூல் வகுப்பு, அதன் ரன்() முறையை மேலெழுதவும் . அந்த கடைசி தேவை மிகவும் முக்கியமானது. ரன்() முறையில் தான் நமது த்ரெட்டை இயக்குவதற்கான தர்க்கத்தை வரையறுக்கிறோம். இப்போது, நாம் MyFirstThread இன் நிகழ்வை உருவாக்கி இயக்கினால் , ரன்() முறை ஒரு பெயருடன் ஒரு வரியைக் காண்பிக்கும்: getName() முறை தானாக ஒதுக்கப்படும் நூலின் 'சிஸ்டம்' பெயரைக் காட்டுகிறது. ஆனால் நாம் ஏன் தற்காலிகமாக பேசுகிறோம்? ஒன்றை உருவாக்கி கண்டுபிடிப்போம்!
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
MyFirstThread thread = new MyFirstThread();
thread.start();
}
}
}
கன்சோல் வெளியீடு: நான் நூல்! என் பெயர் நூல்-2 நான் நூல்! என் பெயர் நூல்-1 நான் நூல்! என் பெயர் நூல்-0 நான் நூல்! என் பெயர் நூல்-3 நான் நூல்! என் பெயர் நூல்-6 நான் நூல்! என் பெயர் நூல்-7 நான் நூல்! என் பெயர் நூல்-4 நான் நூல்! என் பெயர் நூல்-5 நான் நூல்! என் பெயர் நூல்-9 நான் நூல்! எனது பெயர் த்ரெட்-8 10 த்ரெட்களை உருவாக்குவோம் ( MyFirstThread ஆப்ஜெக்ட்கள், இது த்ரெட்டைப் பெறுகிறது ) மற்றும் ஒவ்வொரு பொருளின் தொடக்க() முறையை அழைப்பதன் மூலம் அவற்றைத் தொடங்கலாம். தொடக்க() முறையை அழைத்த பிறகு , ரன்() முறையில் உள்ள தர்க்கம் செயல்படுத்தப்படுகிறது. குறிப்பு: நூல் பெயர்கள் வரிசையில் இல்லை. அவை தொடர்ச்சியாக இல்லை என்பது விந்தையானது:, நூல்-1 , நூல்-2 , மற்றும் பல? நடப்பது போல், 'தொடர்ச்சியான' சிந்தனை பொருந்தாத காலத்திற்கு இது ஒரு எடுத்துக்காட்டு. பிரச்சனை என்னவென்றால், 10 த்ரெட்களை உருவாக்கி இயக்குவதற்கான கட்டளைகளை மட்டுமே நாங்கள் வழங்கியுள்ளோம். த்ரெட் ஷெட்யூலர், ஒரு சிறப்பு ஆப்பரேட்டிங் சிஸ்டம் மெக்கானிசம், அவற்றின் செயல்பாட்டின் வரிசையை தீர்மானிக்கிறது. அதன் துல்லியமான வடிவமைப்பு மற்றும் முடிவெடுக்கும் உத்தி ஆகியவை ஆழமான விவாதத்திற்கான தலைப்புகளாகும், அதை நாங்கள் இப்போது முழுக்க மாட்டோம். நினைவில் கொள்ள வேண்டிய முக்கிய விஷயம் என்னவென்றால், ப்ரோக்ராமர் நூல்களை செயல்படுத்தும் வரிசையை கட்டுப்படுத்த முடியாது. நிலைமையின் தீவிரத்தை புரிந்து கொள்ள, மேலே உள்ள எடுத்துக்காட்டில் உள்ள முக்கிய() முறையை இன்னும் இரண்டு முறை இயக்க முயற்சிக்கவும். இரண்டாவது இயக்கத்தில் கன்சோல் வெளியீடு: நான் நூல்! என் பெயர் நூல்-0 நான் நூல்! என் பெயர் நூல்-4 நான் நூல்! என் பெயர் நூல்-3 நான் நூல்! என் பெயர் நூல்-2 நான் நூல்! என் பெயர் நூல்-1 நான் நூல்! என் பெயர் நூல்-5 நான் நூல்! என் பெயர் நூல்-6 நான் நூல்! என் பெயர் நூல்-8 நான் நூல்! என் பெயர் நூல்-9 நான் நூல்! மூன்றாவது ஓட்டத்திலிருந்து எனது பெயர் த்ரெட்-7 கன்சோல் வெளியீடு: நான் த்ரெட்! என் பெயர் நூல்-0 நான் நூல்! என் பெயர் நூல்-3 நான் நூல்! என் பெயர் நூல்-1 நான் நூல்! என் பெயர் நூல்-2 நான் நூல்! என் பெயர் நூல்-6 நான் நூல்! என் பெயர் நூல்-4 நான் நூல்! என் பெயர் நூல்-9 நான் நூல்! என் பெயர் நூல்-5 நான் நூல்! என் பெயர் நூல்-7 நான் நூல்! என் பெயர் நூல்-8
மல்டித்ரெடிங்கால் உருவாக்கப்பட்ட சிக்கல்கள்
புத்தகங்களுடனான எங்கள் எடுத்துக்காட்டில், மல்டித்ரெடிங் மிக முக்கியமான பணிகளைத் தீர்க்கிறது மற்றும் எங்கள் நிரல்களை விரைவாகச் செய்ய முடியும் என்பதை நீங்கள் பார்த்தீர்கள். பெரும்பாலும் பல மடங்கு வேகமாக. ஆனால் மல்டித்ரெடிங் ஒரு கடினமான தலைப்பு என்று கருதப்படுகிறது. உண்மையில், தவறாகப் பயன்படுத்தினால், அது அவற்றைத் தீர்ப்பதற்குப் பதிலாக சிக்கல்களை உருவாக்குகிறது. 'சிக்கல்களை உருவாக்குகிறது' என்று நான் கூறும்போது, சில சுருக்க அர்த்தத்தில் நான் சொல்லவில்லை. மல்டித்ரெடிங் உருவாக்கக்கூடிய இரண்டு குறிப்பிட்ட சிக்கல்கள் உள்ளன: முட்டுக்கட்டை மற்றும் ரேஸ் நிலைமைகள். டெட்லாக் என்பது பல இழைகள் ஒன்றோடொன்று வைத்திருக்கும் ஆதாரங்களுக்காகக் காத்திருக்கும் ஒரு சூழ்நிலையாகும், மேலும் அவை எதுவும் தொடர்ந்து இயங்க முடியாது. அடுத்த பாடங்களில் அதைப் பற்றி மேலும் பேசுவோம். பின்வரும் உதாரணம் இப்போதைக்கு போதுமானதாக இருக்கும்: Thread-1 சில பொருள்-1 உடன் தொடர்பு கொள்கிறது என்றும், Thread-2 Object-2 உடன் தொடர்பு கொள்கிறது என்றும் கற்பனை செய்து பாருங்கள். மேலும், நிரல் இவ்வாறு எழுதப்பட்டுள்ளது:- நூல்-2 பொருள்-2 உடன் தொடர்புகொள்வதை நிறுத்திவிட்டு பொருள்-1 க்கு மாறியவுடன் நூல்-1 பொருள்-1 உடன் தொடர்புகொள்வதை நிறுத்திவிட்டு பொருள்-2 க்கு மாறுகிறது.
- நூல்-1 பொருள்-1 உடன் தொடர்புகொள்வதை நிறுத்திவிட்டு பொருள்-2 க்கு மாறியவுடன் நூல்-2 பொருள்-2 உடன் தொடர்புகொள்வதை நிறுத்துகிறது மற்றும் பொருள்-1 க்கு மாறுகிறது.
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("Thread executed: " + getName());
}
}
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
MyFirstThread thread = new MyFirstThread();
thread.start();
}
}
}
உணவை சமைக்கும் ரோபோவை இயக்குவதற்கு நிரல் பொறுப்பு என்று இப்போது கற்பனை செய்து பாருங்கள்! நூல்-0 குளிர்சாதன பெட்டியில் இருந்து முட்டைகளை பெறுகிறது. நூல்-1 அடுப்பை இயக்குகிறது. நூல்-2 ஒரு பாத்திரத்தை எடுத்து அடுப்பில் வைக்கிறது. நூல்-3 அடுப்பை பற்றவைக்கிறது. நூல்-4 கடாயில் எண்ணெய் ஊற்றுகிறது. நூல்-5 முட்டைகளை உடைத்து வாணலியில் ஊற்றுகிறது. நூல்-6 முட்டை ஓடுகளை குப்பைத் தொட்டியில் வீசுகிறது. நூல்-7 பர்னரில் இருந்து சமைத்த முட்டைகளை நீக்குகிறது. நூல்-8 சமைத்த முட்டைகளை ஒரு தட்டில் வைக்கிறது. நூல்-9 பாத்திரங்களைக் கழுவுகிறது. எங்கள் நிரலின் முடிவுகளைப் பார்க்கவும்: Thread செயல்படுத்தப்பட்டது: Thread-0 Thread செயல்படுத்தப்பட்டது: Thread-2 Thread இயக்கப்பட்டது செயல்படுத்தப்பட்டது: நூல்-7 நூல் செயல்படுத்தப்பட்டது: நூல்-3 இது காமெடி வாடிக்கையா? :) மற்றும் அனைத்து ஏனெனில் எங்கள் நிரல் வேலை நூல்கள் செயல்படுத்தும் வரிசையை சார்ந்துள்ளது. தேவையான வரிசையின் சிறிதளவு மீறல் கொடுக்கப்பட்டால், எங்கள் சமையலறை நரகமாக மாறும், மேலும் ஒரு பைத்தியக்கார ரோபோ அதைச் சுற்றியுள்ள அனைத்தையும் அழிக்கிறது. மல்டித்ரெட் புரோகிராமிங்கிலும் இது ஒரு பொதுவான பிரச்சனை. நீங்கள் அதைப் பற்றி ஒன்றுக்கு மேற்பட்ட முறை கேள்விப்படுவீர்கள். இந்த பாடத்தை முடிக்கையில், மல்டித்ரெடிங் பற்றிய ஒரு புத்தகத்தை பரிந்துரைக்க விரும்புகிறேன். 'Java Concurrency in Practice' 2006 இல் எழுதப்பட்டது, ஆனால் அதன் பொருத்தத்தை இழக்கவில்லை. இது மல்டித்ரெட் ஜாவா புரோகிராமிங்கிற்கு அர்ப்பணிக்கப்பட்டுள்ளது - அடிப்படைகள் முதல் பொதுவான தவறுகள் மற்றும் எதிர் வடிவங்கள் வரை. நீங்கள் ஒரு நாள் மல்டித்ரெடிங் குருவாக மாற முடிவு செய்தால், இந்த புத்தகம் அவசியம் படிக்க வேண்டும். அடுத்த பாடங்களில் சந்திப்போம்! :)
GO TO FULL VERSION