NGHIÊN CỨU CÁC KĨ THUẬT XỬ LÝ CỦA LinkedBlockingQueue, LinkedTranferQueuePriorityBlockingQueue LinkedBlockingQueue là một optionallybounded hang đợi chặn dựa trên các nút liên kết. LinkedBlockingQueue có thể được giới hạn nếu dung lượng nó được cung cấp, nếu không LinkedBlockingQueue sẽ không bị giới hạn PriorityBlockingQueue là 1 hàng đợi không giới hạn sử dụng tương tự như PriorityQueue, vì nó không bị rang buộc nên việc thêm các phần tử đôi khi không thành công do tài nguyên cạn kiệt LinkedTranferQueue là 1 phần của Java Collection Framework. Nó được giới thiệu trong JDK 1.7 và nó thuộc về gói java.util.concurent. Nó thực hiện TranferQueue và cung cấp 1 chức năng không bị ràng buộc dựa trên nút được liên kết. Các phần tử trong LinkedTranferQueue được sắp xếp thep thứ tự FIFO, với phần đầu trỏ đến phần tử đã oqr hàng đợi lâu nhất và phần đuôi trỏ đến phần tử trong hàng đợi ngắn nhất
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
ﻣKHOA CÔNG NGHỆ THÔNG TIN ﻣ
BÀI TẬP LỚN LẬP TRÌNH JAVA
NGHIÊN CỨU CÁC KĨ THUẬT XỬ LÝ CỦA LinkedBlockingQueue, LinkedTranferQueue
PriorityBlockingQueue
Hà Nội – 2020
1
Trang 2LỜI NÓI ĐẦU
Hiện nay, ngành CNTT được xem là ngành đào tạo mũi nhọn hướng đến sự pháttriển của công nghệ và khoa học kỹ thuật trong thời đại số hóa ngày nay Công nghệthông tin là một ngành học được đào tạo để sử dụng máy tính và các phần mềm máy tính
để phân phối và xử lý các dữ liệu thông tin, đồng thời dùng để trao đổi, lưu trữ và chuyểnđổi các dữ liệu thông tin dưới nhiều hình thức khác nhau Việc sử dụng các ngôn ngữ lậptrình như C, C++, PHP… khá phát triển và được nâng cao hơn
Đặc biệt Java là ngôn ngữ đã trở thành một trong những ngôn ngữ lập trình pháttriển nhất trên thế giới Bởi, bạn có thể tìm thấy Java tại các ứng dụng và môi trường củawebsite trên tất cả các hệ điều hành và nền tảng khác nhau Là một ngôn ngữ lập trình
hướng đối tượng nên Java có nhiểu đặc trưng phù hợp với tất cả các thiết kế website.
Đặc điểm nổi bật nhất của Java là nó không phụ thuộc vào hệ điều hành và bộ xử lý.Điều này cho phép một ứng dụng viết bằng Java có thể được thực hiện trên bất kỳ hệ điềuhành và hệ xử lý nào có hỗ trợ Java Do vậy, người lập trình chỉ cần viết ứng dụng bằngJava đúng một lần, sau đó có thể sử dụng ứng dụng này trên các hệ điều hành khác nhaunhư Windows10, WindowsNT, Mac OS, Unix, … theo phương châm: “viết một lần, sửdụng ở bất kỳ đâu”
Song song với đó, ta cần nghiên cứu sâu hơn về các kỹ thuật làm việc với Pair classtrong JavaTuples Bên dưới là nghiên cứu đề tài của nhóm 12, do trình độ chuyên môn,kinh nghiệm và kiến thức của chúng em còn hạn chế, vì vậy chúng em rất mong nhậnđược lời khuyên của giáo viên và các bạn cho đề tài nghiên cứu của chúng em ngày cànghoàn thiện
Chúng em xin chân thành cảm ơn!
2
Trang 3Chương 1. Tổng quan về LinkedBlockingQueue, LinkedTranferQueue, PriorityBlockingQueue
1.1.Tổng quan về LinkedBlockingQueue
1.1.1.Khái niệm
LinkedBlockingQueue là một optionally-bounded hang đợi chặn dựa trên các
nút liên kết LinkedBlockingQueue có thể được giới hạn nếu dung lượng nó đượccung cấp, nếu không LinkedBlockingQueue sẽ không bị giới hạn
Hàng đợi này sắp xếp các phần tử FIFO ( Nhập trước xuất trước) – Phân tử đầu
là phân tử cũ nhất, phần tử đuôi là phần tử mới nhất Các phần tử mới luôn đượcchèn vào sau phần tử cuối của hàng đợi và các phần tử được truy xuất là các phần tửđầu của hàng đợi
1.1.2.Hệ thống phân cấp
LinkedBlockingQueue<E> kế thừa từ AbstractCollection và các implements interface như Serializable, Interable<E>, Collection<E>, BlockingQueue<E>, Queue<E>.
1.1.3.Các phương thức
Khai báo:
Contructor
- Với dung lượng không xác định ( Integer.MAX_VALUE )
- Với dung lượng cố định
3
public class LinkedBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, Serializable
LinkedBlockingQueue <E> lbq = new LinkedBlockingQueue <E> ();
LinkedBlockingQueue<E> lbq = new LinkedBlockingQueue(int
capacity);
Trang 4+ capacity là dung lượng tối đa của hàng đợi.
- Với dung lượng cố định, chứa các phần tử khởi tạo ban đầu là tập hợp đã cho,được thêm vào theo thứ tự duyệt của trình lặp
Basic Operations
- Thêm phần tử
Phương thức add(e) của LinkedBlockingQueue sẽ chèn phần tử đượctruyền dưới dạng tham số vào cuối của hàng đợi đã tạo sẵn nếu hàng đợichưa đầy Nếu Hàng đợi đã đầy thì phương thức này sẽ đợi dung lượng trống
và sau khi có dung lượng trống thì nó sẽ được chèn vào hàng đợi
- Xóa phần tửTrong đó :
+ capacity là dung lượng tối đa của hàng đợi
+ value là giá trị được thêm vào
+ capacity là dung lượng tối đa của hàng đợi
+ value là giá trị bị xóa khỏi hàng đợi
- Lặp các phần tử
Phương thức iterator () của hàng đợi trả về trình lặp của các phần tửtheo 1 trình tự thích hợp Các phần tử trả về từ phương thức này chứa tất cảcác phần tử theo thứ tự từ đầu tiên đến cuối cùng của hàng đợi
4
LinkedBlockingQueue<E> lbq = new LinkedBlockingQueue
(Collection<? extends E> c);
LinkedBlockingQueue<Integer> lbq = new LinkedBlockingQueue<Integer>(capacity);
lbq.add(value);
LinkedBlockingQueue<Integer> lbq = new LinkedBlockingQueue<Integer>(capacity);
lbq.remove(value);
LinkedBlockingQueue<Integer> lbq = new LinkedBlockingQueue<Integer>(capacity);
Trang 5Trong đó :
+ capacity là dung lượng tối đa của hàng đợi.
+ list là tập hợp chứa các phần tử của hàng đợi.
- Truy cập các phần tử
Phương thức peek () của LinkedBlockingQueue trả về phần tử đầu củaLinkedBlockingQueue Nó truy xuất giá trị của phần tử đầu nhưng khôngloại bỏ nó Nếu LinkedBlockingQueue trống thì nó trả về null
Trong đó :
+ capacity là dung lượng tối đa của hàng đợi.
+ head là phần đầu của hàng đợi, được lấy ra bằng phương thức peek ().
1.2.Tổng quan về LinkedTranferQueue
1.2.1 Khái niệm
LinkedTranferQueue là 1 phần của Java Collection Framework Nó
được giới thiệu trong JDK 1.7 và nó thuộc về gói java.util.concurent Nó thựchiện TranferQueue và cung cấp 1 chức năng không bị ràng buộc dựa trên nútđược liên kết Các phần tử trong LinkedTranferQueue được sắp xếp thep thứ tựFIFO, với phần đầu trỏ đến phần tử đã oqr hàng đợi lâu nhất và phần đuôi trỏđến phần tử trong hàng đợi ngắn nhất
1.2.2 Hệ thống phân cấp
5
LinkedBlockingQueue<Integer> lbq = new LinkedBlockingQueue<Integer>(capacity);
Int head = lbq.peek();
Trang 6LinkedTranferQueue<E> kế thừa từ AbstractCollection<E>,
AbtractQueue<E> và các implements interface như Serializable,
Interable<E>, Collection<E>, BlockingQueue<E>, Queue<E>,
public class LinkedTransferQueue<E> extends AbstractQueue<E>
implements TransferQueue<E>, Serializable
LinkedTransferQueue <E> ltq = new LinkedTransferQueue <E> ();
Trang 7 Basic Opertions
- Thêm phần tử
Có nhiều phương thức khác nhau được cung cấp bởiLinkedTranferQueue để thêm hoặc chèn phần tử Chúng là add(E e), put(Ee), offer(E e), transfer(E e) Các phương thức add, put và offer không quantâm đến các nguồn khác có truy cập vào hàng đợi trong khi transfer() chờmột hoặc nhiều luông người nhận
Trong đó:
+ c là tập hợp các phần tử khởi tạo cùng với hàng đợi
+ value là giá trị được thêm hoặc chèn vào
- Xóa phần tử
Phương thức remove() được LinkedTranferQueue cung cấp để loại bỏ 1 phần
tử nếu nó có trong hàng đợi này
Trong đó:
+ c là tập hợp phần tử được khởi tạo cùng với hàng đợi
+ value phần tử bị xóa ra khỏi hàng đợi
LinkedTransferQueue<E> ltq = new LinkedTransferQueue<E>(Collection<E> c);
Ltq.remove(value);
LinkedTransferQueue<String> ltq = new LinkedTransferQueue<String>();
Iterator<String> list = ltq.iterator();
Trang 8PriorityBlockingQueue là 1 hàng đợi không giới hạn sử dụng tương tự
như PriorityQueue, vì nó không bị rang buộc nên việc thêm các phần tử đôi khikhông thành công do tài nguyên cạn kiệt
PriorityQueue là 1 hàng đợi xử lí các đối tượng dựa trên mức độ ưu tiên.
Các phần tử của hàng đợi được sắp xếp theo thứ tự tự nhiên hoặc bởiComparator được cung cấp tại thời điểm xây dựng hàng đợi
Lớp này không cho phép các phần tử rỗng.
1.3.2.Hệ thống phân cấp
8
Trang 9PriorityBlockingQueue<E> kế thừa từ AbstractQueue<E> và các
implements interface như Serializable, Interable<E>, Collection<E>,
- Hàng đợi được khởi tạo chứa các phần tử trong tập hợp được chỉ định
- Hàng đợi với dung lượng ban đầu được chỉ định để sắp xếp các phần tử của nótheo thứ tự tự nhiên của chúng
Basic Operations
- Thêm phần tử
Phương thức add(E e) sẽ chèn phần tử được truyền dưới dạng tham số vàophương thức vào phần cuối của hàng đợi này Phương thức này trả về truenếu việc thêm phần tử thành công Nếu không nó trả về false
9
public class PriorityBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, Serializable
PriorityBlockingQueue<E> pbq = new PriorityBlockingQueue<E>();
PriorityBlockingQueue<E> pbq = new PriorityBlockingQueue(Collection<? extends E> c);
PriorityBlockingQueue<E> pbq = new PriorityBlockingQueue<E>(capacity);
PriorityBlockingQueue<E> pbq = new PriorityBlockingQueue<E>();
pbq.add(value);
Trang 10- Xóa phần tử
Phương thức remove(Object obj) được sử dung để xóa một phần tử khỏi hàngđợi này Phương thức này loại bỏ một trường hợp duy nhất phần tử đượctruyền dưới dạng tham số nếu có mặt Nó trả về true chỉ khi phần tử bị xóa,nếu không nó trả về false Clear() được sử dụng để loại bỏ tất cả các phần tửcùng 1 lúc
- Lặp phần tử
Phương thức iterator() của trả về 1 trình vòng lặp trên các phần tử Các phần
tử trả về của phương thức này không tuân theo bất kỳ trình tự nào
- Truy cập phần tử
Phương thức peek() trả về phần tử đầu của PriorityBlockingQueue nhưngkhông loại bỏ nó Nếu PriorityBlockingQueue không chứa bất kì phần tử nàothì phương thức này trả về null Hàng đợi PriorityBlockingQueue sử dụngcác quy tắc xếp chồng như lớp PriorityQueue
- Bộ so sánh
Phương thức comparator() trả về bộ so sánh có thể được sử dụng để sắp xếpthứ tự các phần tử trong hàng đợi Phương thức trả về giá trị null nếu hàngđợi tuân theo mẫu sắp xếp tự nhiên của phần tử
10
PriorityBlockingQueue<E> pbq = new PriorityBlockingQueue<E>();
pbq.remove(value);
pbq.clear();
PriorityBlockingQueue<E> pbq = new PriorityBlockingQueue<E>();
Iterator list = pbq.iterator();
PriorityBlockingQueue<E> pbq = new PriorityBlockingQueue<E>();
Iterator list = pbq.peek();
PriorityBlockingQueue<E> PrioQueue = new PriorityBlockingQueue<E>(
10, new Comparator<E>() { public int compare(E a, E b) {
//code
Trang 11Chương 2. Các phương thức đã xây dựng
2.1.Các phương thức của LinkedBlockingQueue
2.1.1 Phương thức tạo một LinkedBlockingQueue
2.1.2 Nạp chồng constructor với dung lượng tối đa cho trước
2.1.3 Nạp chồng constructor với mảng Person có sẵn và số phần tử tối đa cho trước
11
Trang 122.1.4 Nạp chồng constructor với tham số là n phần tử tối đa và m đới tượng Person được khởi tạo
12
Trang 132.1.5 Phương thức thêm phần tử vào LinkedBlockingQueue
2.1.6 Phương thức xóa 1 phần tử ra khỏi LinkedBlockingQueue
13
Trang 142.1.7 Phương thức xóa tất cả các phần tử ra khỏi LinkedBlockingQueue
2.1.8 Phương thức tìm phần tử trong BlockingQueue
2.1.9 Phương thức in các phần tử của LinkedBlockingQueue ra màn hình
2.1.10 Phương thức lấy ra phần tử đầu của LinkedBlockingQueue với Poll()
14
Trang 152.1.11 Phương thức lấy ra phần tử đầu của LinkedBlockingQueue với Peek()
2.1.12 Phương thức chuyển LinkedBlockingQueue thành ArrayList
2.1.13 Phương thức lấy kích thức của hàng đợi
2.2.Các phương thức của LinkedTransferQueue
2.2.1 Phương thức constructor khởi tạo LinkedTransferQueue
15
Trang 162.2.2 Nạp chồng constructor với số phần tử được khởi tạo ngẫu nhiên
2.2.3 Nạp chồng constructor với đầu vào là 1 mảng Person
16
Trang 172.2.4 Nạp chồng constructor với đầu vào là 1 mảng Person số lượng n phần tử
2.2.5 Thêm 1 Person vào LinkedTransferQueue
2.2.6 Xóa Person ở vị trí đầu tiên ra khởi LinkedTranferQueue
17
Trang 182.2.7 Kiểm tra Person có trong hàng đợi hay không
2.2.8 Chuyển hàng đợi đã cho thành ArrayList
2.2.9 Trả về dung lượng hiện tại của hàng đợi
2.2.10 Xóa nhóm phần tử thỏa mãn điều kiện
18
Trang 192.3.Các phương thức PriorityBlokingQueue
2.3.1 Phương thức constructor khởi tạo PriorityBlockingQueue
2.3.2 Nạp chồng constructor với tham số là 1 mảng person và n phần tử tối đa
19
Trang 202.3.3 Nạp chồng constructor với tham số là 1 ArrayList và n phần tử
2.3.4 Nạp chồng constructor với tham số là n phần tử được khởi tạo cùng
20
Trang 212.3.5 Phương thức thêm 1 Person vào trong PriorityBlogkingQueue
2.3.6 Phương thức xóa phần tử đầu tiên của PriorityBlockingQueue
2.3.7 Phương thức xóa tất cả các Person khỏi PriorityBlockingQueue
2.3.8 Phương thức lấy ra phần tử đầu của PriorityBlockingQueue với peek()
21
Trang 22- Ta thấy được sự khác biệt giữa các kiểu hàng đợi khác nhau nhưLinkedBlockingQueue là xác định dung lượng, ko có sự ưu tiên giữa các phần tửvới nhau nhưng PriorityBlockingQueue thì lại có, …
22
Trang 23Chương 3. Kịch bản chạy và kết quả
Trang 243.1.3 Kịch bản constructor với tham số là 1 mảng Person và n phần tử tối đa
Kết quả:
24
Trang 253.1.4 Kịch bản constructor với tham số n dung lượng tối đa và m Person được khởi tạo
Kết quả chạy:
25
Trang 263.1.5 Kịch bản chạy phương thức thêm 1 phần tử vào LinkedBlockingQueue
Kết quả chạy:
26
Trang 273.1.6 Kịch bản chạy phương thức xóa phần tử đầu ra khỏi hàng đợi
Kết quả chạy:
27
Trang 283.1.7 Kịch bản chạy phương thức xóa tất cả các phần tử khỏi hàng đợi
Kết quả chạy:
3.1.8 Kịch bản chạy phương thức tìm phần tử trong LinkedBlockingQueue
28
Trang 30Kết quả chạy:
3.1.11 Kịch bản chạy phương thức lấy phần tử đầu với peek()
Kết quả chạy:
30
Trang 313.1.12 Kịch bản chạy phương thức chuyển LinkedBlockingQueue thành ArrayList
Kết quả chạy:
31
Trang 323.1.13 Kịch bản chạy phương thức lấy kích thức hiện tại của hàng đợi
Kết quả chạy:
3.2 Các kịch bản của LinkedTransferQueue
3.2.1 Kịch bản chạy constructor LinkedTranferQueue
32
Trang 363.2.7 Kịch bản chạy phương thức kiểm tra phần tử có trong hàng đợi hay không
Trang 37Kết quả chạy:
3.2.10 Kịch bản chạy phương thức xóa 1 nhóm phần tử thỏa mãn điều kiên
Kết quả chạy:
37
Trang 383.3 Các kịch bản chạy của PriorityBlockingQueue
3.3.1 Kịch bản chạy phương thức Constructor
Trang 393.3.3 Kịch bản chạy Constructor với tham số là 1 ArrayList và n phần tử tối đa
Trang 403.3.5 Kịch bản chạy phương thức thêm 1 Person
Trang 43ĐÁNH GIÁ VÀ KẾT LUẬN
Để kiểm tra xem các method có hoạt động đúng hay không chúng ta cần xây dựngcác kịch bản kiểm tra.Số lượng kịch bản kiểm tra phụ thuộc vào số lượng và loại phươngthức.Các phương thức đã xây dựng chạy bằng kịch bản đều đã đạt kết quả mong đợi
Nhờ có sự hướng dẫn của thầy Hoàng Quang Huy, cùng với sự nghiên cứu, tìm tòikhông ngừng của bản thân, nhóm 9 chúng em nhận thấy thư viện Concurrent có rất nhiềutính năng đặc biệt mà chúng em chưa hề biết tới Bên cạnh đó, nhóm cũng đã tìm hiểuđược các kỹ thuật làm việc với LinkedBlockingQueue, LinkedTranferQueue và PairPriorityBlockingQueue Ngoài ra, nhóm còn cài đặt thành công thư viện Concurrent vàviết các API làm việc với LinkedBlockingQueue, LinkedTranferQueue và PairPriorityBlockingQueue
TÀI LIỆU THAM KHẢOhttps://www.geeksforgeeks.org/linkedtransferqueue-in-java-with-examples/ https://www.geeksforgeeks.org/priorityblockingqueue-class-in-java/
https://www.geeksforgeeks.org/linkedblockingqueue-class-in-java/
.
43