מהו BlockingQueue בג'אווה וכיצד ליישם אותו?



מאמר זה על BlockingQueue ב- Java יעזור לכם ללמוד על ממשק BlockingQueue. זה גם ייתן לך תובנות לגבי השיטות והיישום הפרטי שלה

פופולרי מאוד בקרב מתכנתים בגלל מגוון מקיף של תכונות מובנות. לרוב יהיה לך פיתרון ייעודי לבעיה שלך עוד לפני שהיא מופיעה. חלק כל כך שימושי וחשוב מאוד של הוא ממשק BlockingQueue בג'אווה. באמצע מאמר זה, אזרוק מעט אור על BlockingQueue בג'אווה ועל השיטות ליישומו.

להלן הנושאים המכוסים במאמר זה:





ממשק BlockingQueue בג'אווה

BlockingQueue בג'אווה הוא ממשק שנוסף ב- Java 1.5 יחד עם כמה מחלקות שירות במקביל כמו ConcurrentHashMap, CopyOnWriteArrrayList וכו 'ממשק BlockingQueue שייך java.util.concurrent חֲבִילָה .ממשק זה משפר את בקרת הזרימה על ידי הפעלת חסימה, למקרה שרשור מנסה להוריד תור ריק או להקים תור מלא. בשני המקרים ממשק זה יועיל.במילים פשוטות יותר, נניח א מנסה להוסיף אלמנטים לתור כבר מלא. בשלב זה של התוכנית, יופעל BlockingQueue שיחסום את השרשור המסוים עד שרשור אחר ישחרר את התור כדי לפנות מקום. זה יכול להיות תוצאה של הוצאת אלמנט (ים) של פינוי התור כולו. באופן דומה, BlockingQueue יופעל לחסימת שרשור המנסה להוריד תור ריק כבר עד להוספה של שרשור אחר או להוסיף אלמנט לריק תוֹר .

בזמן העבודה עם ממשק BlockingQueue בג'אווה, עליך לזכור שהוא אינו מקבל ערך null. במקרה שאתה מנסה לעשות זאת זה יזרוק מיד NullPointerException. האיור שלהלן מייצג את העבודה של ממשק BlockingQueue בג'אווה.



BlockingQueue - BlockingQueue בגזֶה מִמְשָׁק משמש בעיקר בין יצרנים לצרכנים מכיוון שהוא בטוח בחוטים.כוונתי היא שממשק BlockingQueue יכול לשמש ליצירת תור שניתן לשתף גם את המפיק וגם את הצרכן

כדי לעבוד עם BlockingQueue בג'אווה, ראשית עליך להכיר את הסוגים שלו. הרשו לי להכיר לכם אותם בחלק הבא במאמר זה.

סוגי קונסטרוקטורים ל- BlockingQueue בג'אווה

ישנם שני סוגים של בונים לממשק BlockingQueue בג'אווה:



  • תור ללא גבולות: עבור סוג זה של תור, הקיבולת תוגדר ל- Integer.MAX_VALUE. תור בלתי מוגבל לעולם לא ייחסם מכיוון שהוא יכול לצמוח באופן דינמי, בכל פעם שמוכנס אליו אלמנט. להלן התחביר ליצירת תור בלתי מוגבל:
BlockingQueue bq = חדש LinkedBlockingDeque ()
  • תור מוגבל: עבור סוג זה של תור, עליך להעביר את קיבולת התור בזמן יצירתו, כלומר כ- בּוֹנֶה פָּרָמֶטֶר. לאחר הקצאת הגודל, לא ניתן לשנותו. להלן התחביר ליצירת תור מוגבל:
BlockingQueue bq = חדש LinkedBlockingDeque (10)

עכשיו שאתה מכיר את הדרכים ליישום BlockingQueue בג'אווה, הרשה לי לרשום כמה מהשיטות שלו.

שיטות בממשק BlockingQueue

שיטה תיאור
תוספת בוליאנית (E e) שיטה זו מסייעת בהכנסת האלמנט שצוין לתור זה אם יש מקום בתור אחרלזרוקIllegalStateException
מכיל בוליאני (אובייקט o) שיטה זו מחזירה אמת אם התור מכיל את האלמנט שצוין
int drainTo (אוסף ג) שיטה זו תסיר את כל האלמנטים הזמינים מהתור ותוסיף אותם לאוסף שצוין
int drainTo (אוסף c, int maxElements) שיטה זו תסיר את המספר הנתון של האלמנטים הזמינים מהתור ותוסיף אותם למפורט
הצעה בוליאנית (E e) שיטה זו תכניס את האלמנט שצוין לתור אם הוא לא מלא ויחזיר נכון, אחרת הוא יחזיר שקר
הצעה בוליאנית (E e, פסק זמן ארוך, יחידת TimeUnit) שיטה זו תכניס את האלמנט שצוין לתור. במקרה שהתור מלא, הוא ימתין עד זמן ההמתנה שצוין עד שהמקום יהיה זמין.
סקר E (פסק זמן ארוך, יחידת TimeUnit) שיטה זו מסייעת בשליפה והסרה של ראש התור. במקרה שהתור ריק, הוא ימתין עד זמן ההמתנה שצוין עד שרכיב יהיה זמין
בטל ריק (E e) שיטה זו תכניס את האלמנט שצוין לתור על ידי המתנה למקום שיהיה זמין במקרה שהתור מלא
int stayingCapacity () שיטה זו מסייעת בהחזרת מספר האלמנטים הנוספים שתור זה יכול לקבל באופן אידיאלי מבלי להיחסם
הסר בוליאני (אובייקט o) שיטה זו תסיר מופע יחיד של האלמנט שצוין מהתור רק אם הוא קיים
קח () שיטה זו תסייע בשליפה והסרה של ראש התור על ידי המתנה לאלמנט שיהיה זמין, למקרה שהתור ריק.

יישומי BlockingQueue

כאן אני ישתמש דוגמה פשוטה של ​​BlockingQueue בג'אווה איפהמחלקת EduProducer תפיק את הנתונים ותכניס אותם ל- a תוֹר , בו זמנית, מחלקה אחרת, EduConsumer יסיר את הנתונים מאותה תור.

בשביל זה אצור 3 שיעורים כלומר:

  1. EduProducer
  2. EduConsumer
  3. אדוריקה עיקרית

בואו ניצור כעת את כל אחד מהשיעורים האלה בזה אחר זה.

EduProducer.java

חבילה edureka ייבוא ​​java.util.concurrent.BlockingQueue מחלקה ציבורית EduProducer מיישם Runnable {פרטית סופית BlockingQueue תור @ Override ריק ריק ריק () {try {process ()} לתפוס (InterruptedException e) {Thread.currentThread (). interrupt ()} } תהליך ריק ריק () זורק את InterruptedException {// הכניס 10 כניסות לתור ל- (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

חבילה edureka ייבוא ​​java.util.concurrent.BlockingQueue מחלקה ציבורית EduConsumer מיישמת Runnable {private final BlockingQueue queue @ Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptedException e) {Thread.currentThread (). Interrupt ()}} תהליך ריק ריק (שלם שלם) זורק InterruptedException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} public EduConsumer (תור BlockingQueue) {this.queue = queue}}

EdurekaMain.java

חבילה edureka יבוא java.util.concurrent.BlockingQueue ייבוא ​​java.util.concurrent.LinkedBlockingQueue מחלקה ציבורית EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) Thread new (new EduProducer (queue)) .start () אשכול חדש (EduConsumer חדש (תור)). התחל ()}}

לאחר שתסיים לכתוב את הקוד, הפעל את התוכנית כדי לקבל את הפלט שלהלן:

[מפיק] הוסף: 0 [צרכן] קח: 0 [מפיק] קיבולת הנותרת של התור: 9 [מפיקה] הוסף: 1 [מפיק] קיבולת הנותרת של התור: 9 [מפיק] הוסף: 2 [מפיק] קיבולת הנותרת של התור: 8 [מפיק ] הוסף: 3 [מפיק] קיבולת הנותרת של התור: 7 [צרכן] קח: 1 [מפיק] הוסף: 4 [מפיק] קיבולת הנותרה של התור: 7 [מפיק] הוסף: 5 [מפיק] קיבולת הנותרת של התור: 6 [מפיק] הוסף : 6 [מפיק] קיבולת הנותרה של התור: 5 [צרכן] קח: 2 [מפיק] הוסף: 7 [מפיק] קיבולת הנותרה של התור: 5 [מפיק] הוסף: 8 [מפיק] קיבולת הנותרה של התור: 4 [מפיקה] הוסף: 9 [יצרן] קיבולת הנותרת של התור: 3 [צרכן] קח: 3 [צרכן] קח: 4 [צרכן] קח: 5 [צרכן] קח: 6 [צרכן] קח: 7 [צרכן] קח: 8 [צרכן] קח: 9

זה מביא אותנו לסוף מאמר זה בנושא BlockingQueue בג'אווה. אם ברצונך ללמוד Java בפירוט רב יותר, תוכל לעיין בכתובת שלנו גם כן.

מהו אובייקט בלתי ניתן לשינוי בג'אווה

כעת לאחר שהבנתם את היסודות של BlockingQueue בג'אווה, עיינו ב מאת אדוריקה, חברת למידה מקוונת מהימנה עם רשת של יותר מ -250,000 לומדים מרוצים הפזורים ברחבי העולם. קורס ההכשרה וההסמכה של Java J2EE ו- SOA של אדוריקה מיועד לסטודנטים ואנשי מקצוע שרוצים להיות מפתח Java. הקורס נועד לתת לך יתרון לתכנות ג'אווה ולהכשיר אותך למושגי ג'אווה מרכזיים ומתקדמים יחד עם מסגרות ג'אווה שונות כמו Hibernate & Spring.

יש לך שאלה עבורנו? אנא הזכיר זאת בסעיף ההערות של 'BlockingQueue בג'אווה' ונחזור אליך בהקדם האפשרי.