ArrayBlockingQueue مقابل. مثال على Google Guava Non-Blocking Quueue
نشرت: 2020-12-29
تعد أدوات التزامن رائعة جدًا في Java.
تحتوي الحزمة java.util.concurrent على الكثير من الأدوات المساعدة التي يمكننا استخدامها بعدد من الطرق المختلفة.
في هذا البرنامج التعليمي سوف نتطرق إلى الفرق بين java.util.concurrent. ArrayBlockingQueue
و com.google.common.collect. EvictingQueue
.
ما هو طرد الصف؟
EvictingQueue
هو جزء من Google's Guava library
. وهو عبارة عن قائمة انتظار (حجم ثابت) non-blocking
محظورة bounded
والتي removes
العناصر تلقائيًا من head
قائمة الانتظار عند محاولة إضافة عناصر إلى full queue
.
كيف تضيف مكتبة Google Guava إلى مشروع eclipse-java الخاص بك؟
يمكنك إضافة تبعية maven أدناه إلى ملف pom.xml إذا كنت تستخدم مشروع maven. في حالة وجود مشروع non-maven
- يجب عليك تنزيله من هنا وتضمين مكتبة في مسار الفصل الخاص بمشروعك.
1 2 3 4 5 |
< dependency > < groupId > com . google . guava < / groupId > < artifactId > guava < / artifactId > < version > 30.1.1 - jre < / version > < / dependency > |
ما هو ArrayBlockingQueue؟
إنها قائمة انتظار bounded
blocking
حجم ثابت) تخزن العناصر داخليًا في مصفوفة. CAN'T
تخزين كميات unlimited
من العناصر. أوامر قائمة الانتظار هذه عناصر FIFO
(الوارد أولاً يصرف أولاً).
Read more
: مثال قائمة انتظار Singleton
لنبدأ على سبيل المثال
- قم بإنشاء ArrayBlockingQueue بحجم 10
- إنشاء قائمة انتظار بحجم 10
- حاول إضافة 15 عنصرًا إلى قائمة الانتظار
- بالنسبة لـ EvictingQueue - لن ينتج عن ذلك أي خطأ
- بالنسبة إلى ArrayBlockingQueue - سيؤدي إلى ظهور خطأ
Queue Full
قم بإنشاء فئة CrunchifyArrayBlockingQueueVsEvictingQueue.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
package crunchify . com . tutorials ; import com . google . common . collect . EvictingQueue ; import java . util . Queue ; import java . util . concurrent . ArrayBlockingQueue ; /** * @author Crunchify.com * ArrayBlockingQueue Vs. Google Guava Non-Blocking EvictingQueue Example * */ public class CrunchifyArrayBlockingQueueVsEvictingQueue { private static void CrunchifyArrayBlockingQueue ( ) { // ArrayBlockingQueue: A bounded blocking queue backed by an array. This queue orders elements FIFO (first-in-first-out). // The head of the queue is that element that has been on the queue the longest time. // The tail of the queue is that element that has been on the queue the shortest time. // New elements are inserted at the tail of the queue, and the queue retrieval operations obtain elements at the head of the queue. ArrayBlockingQueue < String > crunchifyQueue = new ArrayBlockingQueue < String > ( 10 ) ; String crunchifyMsg = "This is ArrayBlockingQueue - by Crunchify" ; try { // We are looping for 15 times - Error once queue full for ( int counter = 1 ; counter < = 15 ; counter ++ ) { // add(): Inserts the specified element at the tail of this queue if it is possible to do so immediately without exceeding the queue's capacity, // returning true upon success and throwing an IllegalStateException if this queue is full. crunchifyQueue . add ( crunchifyMsg + counter ) ; // size(): Returns the number of elements in this queue. crunchifyLog ( "ArrayBlockingQueue size: " + crunchifyQueue . size ( ) ) ; } } catch ( Exception e ) { crunchifyLog ( "\nException Occurred: " ) ; e . printStackTrace ( ) ; } } public static void main ( String [ ] args ) { // Test EvictingQueue with size 10 CrunchifyEvictingQueue ( ) ; crunchifyLog ( "\n============= New LINE ==============\n" ) ; // Test ArrayBlockingQueue with size 10 CrunchifyArrayBlockingQueue ( ) ; } private static void CrunchifyEvictingQueue ( ) { // Queue: A collection designed for holding elements prior to processing. Besides basic Collection operations, // queues provide additional insertion, extraction, and inspection operations. // Each of these methods exists in two forms: one throws an exception if the operation fails, // the other returns a special value (either null or false, depending on the operation). Queue < String > crunchifyQueue = EvictingQueue . create ( 10 ) ; String crunchifyMsg = "This is EvictingQueue - by Crunchify" ; try { // We are looping for 15 times - No error after queue full. // Instead, it will remove element from queue in FIFO order for ( int i = 1 ; i < = 15 ; i ++ ) { // add: Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions, // returning true upon success and throwing an IllegalStateException if no space is currently available. crunchifyQueue . add ( crunchifyMsg + i ) ; crunchifyLog ( "EvictingQueue size: " + crunchifyQueue . size ( ) ) ; } } catch ( Exception e ) { crunchifyLog ( "Exception Occurred: " + e ) ; } } private static void crunchifyLog ( String crunchifyText ) { System . out . println ( crunchifyText ) ; } } |
ما عليك سوى تشغيل برنامج Java هذا كتطبيق في Eclipse Console أو IntelliJ IDEA وسترى نتيجة مثل هذه.

نتيجة وحدة التحكم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
EvictingQueue size : 1 EvictingQueue size : 2 EvictingQueue size : 3 EvictingQueue size : 4 EvictingQueue size : 5 EvictingQueue size : 6 EvictingQueue size : 7 EvictingQueue size : 8 EvictingQueue size : 9 EvictingQueue size : 10 EvictingQueue size : 10 EvictingQueue size : 10 EvictingQueue size : 10 EvictingQueue size : 10 EvictingQueue size : 10 ============= New LINE ============== ArrayBlockingQueue size : 1 ArrayBlockingQueue size : 2 ArrayBlockingQueue size : 3 ArrayBlockingQueue size : 4 ArrayBlockingQueue size : 5 ArrayBlockingQueue size : 6 ArrayBlockingQueue size : 7 ArrayBlockingQueue size : 8 ArrayBlockingQueue size : 9 ArrayBlockingQueue size : 10 Exception Occurred : java . lang . IllegalStateException : Queue full at java . base / java . util . AbstractQueue . add ( AbstractQueue . java : 98 ) at java . base / java . util . concurrent . ArrayBlockingQueue . add ( ArrayBlockingQueue . java : 329 ) at crunchify . com . tutorials . CrunchifyArrayBlockingQueueVsEvictingQueue . CrunchifyArrayBlockingQueue ( CrunchifyArrayBlockingQueueVsEvictingQueue . java : 32 ) at crunchify . com . tutorials . CrunchifyArrayBlockingQueueVsEvictingQueue . main ( CrunchifyArrayBlockingQueueVsEvictingQueue . java : 52 ) Process finished with exit code 0 |
اسمحوا لي أن أعرف إذا كنت تواجه أي مشكلة في تشغيل البرنامج أعلاه.