1. Trang chủ
  2. » Công Nghệ Thông Tin

Báo cáo nghiên cứu các kĩ thuật xử lý hàng đợi trong Java

43 27 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nghiên Cứu Các Kĩ Thuật Xử Lý Hàng Đợi Trong Java
Trường học Trường Đại Học Công Nghiệp Hà Nội
Chuyên ngành Công Nghệ Thông Tin
Thể loại Bài Tập Lớn
Năm xuất bản 2020
Thành phố Hà Nội
Định dạng
Số trang 43
Dung lượng 1,04 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

TRƯỜ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 2

LỜ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 3

Chươ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 5

Trong đó :

+ 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 6

LinkedTranferQueue<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 8

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 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 9

PriorityBlockingQueue<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 11

Chươ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 12

2.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 13

2.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 14

2.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 15

2.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 16

2.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 17

2.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 18

2.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 19

2.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 20

2.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 21

2.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 23

Chương 3. Kịch bản chạy và kết quả

Trang 24

3.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 25

3.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 26

3.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 27

3.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 28

3.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 30

Kế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 31

3.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 32

3.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 36

3.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 37

Kế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 38

3.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 39

3.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 40

3.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

Ngày đăng: 31/05/2021, 14:03

TỪ KHÓA LIÊN QUAN

w