प्रोजेक्ट लूम ने Java मध्ये हलके कंकरन्सी कन्स्ट्रक्ट सादर केले आहे. Java मधील उच्च-थ्रूपुट, लाइटवेट कॉन्करन्सी मॉडेलला समर्थन देणे हे प्रोजेक्ट लूमचे मुख्य उद्दिष्ट किंवा उद्दिष्ट आहे.

सध्याच्या Java Concurrency मॉडेलसह समस्या:

आम्हाला आधीच माहित आहे की सध्याचे जावा कॉन्करन्सी मॉडेल ऑपरेटिंग सिस्टम कर्नल लेव्हल थ्रेड्स वापरते. सध्याच्या मॉडेलमधील काही समस्या पाहू.

समस्या १: थ्रेड्सची वाट पाहणे किंवा थ्रेड्स ब्लॉक करणे.

आम्हाला आधीच माहित आहे की जर I/O ऑपरेशन्समुळे तोपर्यंत थ्रेड ब्लॉक झाला असेल तर आम्ही CPU वापरत नाही किंवा CPU सायकल वाया जात आहेत म्हणून आम्ही CPU कार्यक्षमतेने वापरत नाही.

समजा वरील समस्या सोडवण्यासाठी आम्ही जास्त थ्रेड्स तयार करू लागलो, उदाहरणार्थ, जर काही थ्रेड्स ब्लॉक केले असतील तर आम्ही असेच कोणतेही थ्रेड्स स्पॉन करू शकतो जेणेकरून CPU निष्क्रिय होणार नाही आणि आम्ही CPU सायकल कार्यक्षमतेने वापरू शकतो, परंतु यामुळे आणखी एक समस्या निर्माण होते.

समस्या 2: अधिक थ्रेड्स तयार केल्याने JVM क्रॅश होऊ शकतो (आऊट ऑफ मेमरी):

धागा तयार होण्यासाठी वेळ लागतो आणि अंदाजे 1MB मेमरी लागते. त्यामुळे आम्ही अधिक थ्रेड्स तयार करू लागतो ज्यामुळे JVM क्रॅश होऊ शकतो JVM ला दिलेल्या मेमरीवर अवलंबून असते.

आपण वरील दोन समस्या कशा सोडवू शकतो:

आपण वरील समस्या सोडवू शकतो असे दोन आहेत:

  1. प्रतिक्रियाशील प्रोग्रामिंग:

रिऍक्टिव्ह प्रोग्रामिंग इव्हेंट लूपच्या संकल्पनांच्या अंतर्गत कार्य करते जे कधीही ब्लॉक होत नाही किंवा इव्हेंट लूपवर कोणतेही ब्लॉकिंग ऑपरेशन करू नये. हे इव्हेंट रांग वापरते त्यामुळे कोणतेही I/O ऑपरेशन झाल्यास ते रांगेत ढकलले जाते (कॉलबॅक रांगेत ढकलले जातात) जेणेकरून मुख्य थ्रेड ब्लॉक होणार नाही आणि जेव्हा जेव्हा थ्रेडला प्रतिसाद मिळतो आणि मुख्य थ्रेड किंवा इव्हेंट लूपद्वारे कार्यान्वित केला जातो.

2. कोरोटीन वापरणे:

हे वापरकर्ता स्तर किंवा मोड थ्रेड्स सादर करते जे OS अंमलबजावणीऐवजी जावा रनटाइम अंमलबजावणी आणि शेड्यूलर्सवर अवलंबून असतात.

सध्या, जावा अंमलबजावणी कर्नल स्तर शेड्यूलर, निरंतरता आणि थ्रेड्सवर अवलंबून आहे. तर समजा की जर काही I/O ऑपरेशनमुळे थ्रेड ब्लॉक केला गेला असेल तर ते सतत निलंबित करण्यासाठी, संपूर्ण कॉल-स्टॅक संचयित करणे आवश्यक आहे. आणि त्याचप्रमाणे, पुन्हा सुरू केल्यावर कॉल-स्टॅक पुनर्प्राप्त करा.

Java चे थ्रेड्सवर नियंत्रण नसते CPU सर्व विनंतीला समान पद्धतीने हाताळते, आणि म्हणून आम्ही नियंत्रित करू शकत नाही म्हणून तीच विनंती त्याच CPU कडे जाते हे निश्चित नाही हे अगदी कमी संभाव्य आहे.

थ्रेड्स शेड्युलिंगवर नियंत्रण मिळवण्यासाठी आम्हाला ऍप्लिकेशन लेव्हल किंवा यूजर लेव्हल थ्रेड्स, कंटिन्युएशन (उर्फ टास्क) आणि शेड्युलर आवश्यक आहे.

फायबर्स शेड्युलर:

  • हे साध्य करण्यासाठी शेड्युलर आवश्यक आहे जे OS लेव्हल थ्रेड्समध्ये फायबर आणि शेड्यूल टास्क नियंत्रित करू शकतात
  • टास्कच्या माउंट आणि अनमाउंटची काळजी घेते (I/O मुळे) ऑपरेशन.
  • I/O ऑपरेशन दरम्यान इतर कार्ये सुरू ठेवा
  • I/O ऑपरेशन दरम्यान ते जिथे सोडले होते त्याच कार्यासह सुरू ठेवा.

थ्रेड्सवर फायदे:

  1. खूप हलके
  2. थ्रेडच्या तुलनेत फक्त काही Kb स्टॅक घेते (सुमारे 1MB घेते)
  3. अॅप्लिकेशनमध्ये लाखो फायबर चालवू शकतात.
  4. सर्व्हर समवर्ती कनेक्शनची अधिक संख्या हाताळू शकतात.
  5. CPU चा कार्यक्षम वापर

आनंदी शिक्षण.

धन्यवाद