מדריך לממשק תור Java

1. הקדמה

במדריך זה נדון ב- Java תוֹר מִמְשָׁק.

ראשית, אנחנו קח א לְהָצִיץ באיזה א תוֹר עושה, וכמה משיטות הליבה שלה. לאחר מכן, נצלול למספר יישומים שג'אווה מספקת כסטנדרט.

לבסוף נדבר על בטיחות חוטים לפני שנסכם את הכל.

2. הדמיה של התור

נתחיל באנלוגיה מהירה.

דמיין שרק פתחנו את העסק הראשון שלנו - דוכן נקניקיות. אנו רוצים לשרת את הלקוחות הפוטנציאליים החדשים שלנו בצורה היעילה ביותר האפשרית עבור העסק הקטן שלנו; אחד בכל פעם. ראשית, אנו מבקשים מהם להקים קו מסודר מול הדוכן שלנו, כאשר לקוחות חדשים יצטרפו מאחור. הודות לכישורי הארגון שלנו, כעת אנו יכולים לחלק את הנקניקיות הטעימות שלנו בצורה הוגנת.

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

למעשה, רוב תורים ניפגש בעבודה בג'אווה בהתחלה, בהתחלה אופן - מקוצר לרוב ל- FIFO.

עם זאת, יש חריג אחד בו ניגע בהמשך.

3. שיטות ליבה

ה תוֹר מצהיר על מספר שיטות שיש לקודד על ידי כל הכיתות המיישמות. בואו נתווה כמה מהחשובים יותראלה עכשיו:

  1. הַצָעָה() - מכניס אלמנט חדש אל ה- תוֹר
  2. מִשׁאָל()- מסיר אלמנט מקדמת ה- תוֹר
  3. לְהָצִיץ() בודק את האלמנט שבחזית תוֹר, בלי להסיר אותו

4. תקציר תור

תקציר תור האם ה הכי פשוט שאפשר תוֹר יישום שג'אווה מספקת. זה כולל יישום שלדי של חלק מה- תוֹר שיטות הממשק, לא כולל הַצָעָה.

כשאנחנו יוצרים תור מותאם אישית הרחבת ה- תקציר תור מעמד,עלינו לספק יישוםשל ה הַצָעָה שיטה מה כן לֹא אפשר הכנסת אלמנטים אפסיים.

בנוסף, עלינו לספק את השיטות הצצה, סקר, גודל, ו java.utilשל איטרטר.

בואו נרכיב פשוט תוֹר יישום באמצעות תקציר תור.

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

מחלקה ציבורית CustomBaeldungQueue מרחיב את AbstractQueue {אלמנטים פרטיים של LinkedList; ציבורי CustomBaeldungQueue () {this.elements = חדש LinkedList (); }}

הבא, בואו לעקוף את השיטות הנדרשות ולספק את הקוד:

@ Override איטרטור ציבורי איטרטור () {return elements.iterator (); } @ Override int גודל ציבורי () {return elements.size (); } @Override הצעה בוליאנית ציבורית (T t) {if (t == null) להחזיר שקר; elements.add (t); לחזור אמיתי; } @ סקר T ציבורי ציבורי () {Iterator iter = elements.iterator (); T t = iter.next (); אם (t! = null) {iter.remove (); להחזיר t; } להחזיר אפס; } @Override T הצצה ציבורית () {return elements.getFirst (); }

מצוין, בואו נבדוק שזה עובד עם בדיקת יחידה מהירה:

customQueue.add (7); customQueue.add (5); int first = customQueue.poll (); int שנייה = customQueue.poll (); assertEquals (7, ראשון); assertEquals (5, שנייה);

4. ממשקי משנה

באופן כללי, תוֹר ממשק עובר בירושה 3 ממשקי משנה עיקריים. חסימת תורים, תורי העברה, ו דק.

יחד, 3 ממשקים אלה מיושמים על ידי הרוב המכריע של Java הזמינים תורים. בואו נסתכל במהירות על מה שהממשקים הללו נקבעו לעשות.

4.1. חסימת תורים

ה BlockingQueue מִמְשָׁק תומך בפעולות נוספות שמאלצות חוטים להמתין על תוֹרתלוי במצב הנוכחי. חוט עשוי חכה על תוֹר להיות לא ריק כשמנסים לשלוף, או שיהיה ריק בעת ההוספה אלמנט חדש.

תֶקֶן חסימת תורים לִכלוֹל LinkedBlockingQueue, SynchronousQueue, ו ArrayBlockingQueue.

למידע נוסף, עבור למאמר שלנו בנושא חסימת תורים.

4.2. העבר תורים

ה TransferQueue ממשק מרחיב את BlockingQueue ממשק אבל הוא מותאם לדפוס היצרן-צרכני. הוא שולט בזרימת המידע מיצרן לצרכן ויוצר לחץ אחורי במערכת.

ג'אווה נשלחת עם יישום אחד של ה- TransferQueue מִמְשָׁק, LinkedTransferQueue.

4.3. דק

דק קיצור של דשמנמן-הnded קוue והוא מקביל לחפיסת קלפים - ניתן לקחת אלמנטים גם מההתחלה וגם מהסוף דק. בדומה למסורתי תוֹר, ה דק מספק שיטות להוסיף, לאחזר ולהציץ אלמנטים המוחזקים בחלק העליון והתחתון.

לקבלת מדריך מפורט כיצד דק עובד, לבדוק את שלנו ArrayDeque מאמר.

5. תורי עדיפות

ראינו קודם שרוב ה תורים שאנו נתקלים בג'אווה עוקבים אחר עקרון FIFO.

יוצא מן הכלל כזה לכלל זה הוא PriorityQueue. כאשר אלמנטים חדשים מוכנסים לתוך ה- עדיפותתוֹר, הם מסודרים על פי הסדר הטבעי שלהם, או על ידי הגדרה משווה מסופק כאשר אנו בונים את עדיפותתוֹר.

בואו נסתכל כיצד זה עובד עם מבחן יחידה פשוט:

PriorityQueue integerQueue = PriorityQueue חדש (); integerQueue.add (9); integerQueue.add (2); integerQueue.add (4); int ראשון = integerQueue.poll (); int שנייה = integerQueue.poll (); int שלישי = integerQueue.poll (); assertEquals (2, ראשון); assertEquals (4, שנייה); assertEquals (9, שלישי);

למרות הסדר שבו נוספו המספרים השלמים שלנו ל עדיפותתוֹר, אנחנו יכולים לראות את זה סדר האחזור משתנה בהתאם לסדר הטבעי של המספרים.

אנו יכולים לראות כי הדבר נכון גם כשמוחלים עליו מיתרים:

PriorityQueue stringQueue = PriorityQueue חדש (); stringQueue.add ("אוכמניות"); stringQueue.add ("תפוח"); stringQueue.add ("דובדבן"); מחרוזת ראשונה = stringQueue.poll (); מחרוזת שנייה = stringQueue.poll (); מחרוזת שלישית = stringQueue.poll (); assertEquals ("תפוח", ראשון); assertEquals ("אוכמניות", שנייה); assertEquals ("דובדבן", שלישי);

6. חוט בטיחות

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

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

למרבה המזל, ג'אווה מציעה ConcurrentLinkedQueue, ArrayBlockingQueue, ו ConcurrentLinkedDeque שהם בטוחים בחוטים ומושלמים לתוכניות מרובות הליכי משנה.

7. מסקנה

במדריך זה, צללנו עמוק לג'אווה תוֹר מִמְשָׁק.

ראשית, אנחנו בחן מה א תוֹר עושה, טוב כמו ה יישומים שג'אווה מספקת.

הבא, אנחנו הסתכל על א תוֹר'עקרון ה- FIFO הרגיל, כמו גם PriorityQueue אשר שונה בסדרו.

לבסוף, אנחנו חקר בטיחות חוטים ואיך תורים יכול לשמש בסביבה מרובת שרשראות.

כמו תמיד, הקוד זמין ב- GitHub.