Hôm nay chúng ta sẽ tìm hiểu về Java Blocking Queue. java.util.concerrent.BlockingQueue là java Queue hỗ trợ sự điều khiển: nó sẽ đợi đến khi queue khác rỗng trong trường hợp lấy hoặc xóa dữ liệu, và sẽ đợi đến khi có đủ không gian chứa khi thực thi thêm dữ liệu.
Java BlockingQueue
Java BlockingQueue không chấp nhận giá trị null và sẽ quăng lỗi NulPointerException nếu lưu dữ liệu null vào queue
Java BlockingQueue an toàn trong với thread. Tất cả các hàm của queue nguyên bản một cách tự nhiên, sử dụng khóa ở phía trong hoặc các định dạng khác của điều khiển đồng thời.
Java BlockingQueue interface là một phần của java collection framework và nó được sử dụng chính cho vấn đề sản xuất(producer) và tiêu thụ(consumer). Chúng ta không cần quan tâm về vấn đề đợi đến khi có đủ không gian cho producer hoặc đối tượng có tồn tại hay không cho consumer trong BlockingQueue bởi vì nó được sử lý bằng cách thực thi các lớp của BlockingQueue.
Java cung cấp nhiều lớp thực thi của BlockingQueue như là ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue.
Khi thực thi producer và consumer trong BlockingQueue, chúng ta sẽ sử dụng ArrayBlockingQueue. Dưới đây là những hàm quan trọng bạn cần phải biết:
put(E e): Hàm này được sử dụng để thêm phần từ vào queue. Nếu queue đầy, thì nó sẽ đợi cho đến khi có đủ không gian trống.
E take(): Hàm này được sử dụng để lấy ra và xóa 1 phần tử đứng đầu trong queue. Nếu queue rỗng nó sẽ đợi cho đến khi nào có phần tử trong queue.
Và bây giờ chúng ta sẽ tiền hành thực thi về vấn đề producer consumer sử dụng java Blocking Queue.
Ví dụ về Java BlockingQueue – Message
Như là 1 đối tượng java bình thường sẽ được tạo ra bởi Producer và thêm vào queue. Bạn có thể xem nó như là 1 queue message.
package com.journaldev.concurrency;
public class Message {
private String msg;
public Message(String str){
this.msg=str;
}
public String getMsg() {
return msg;
}
}
Ví dụ về Java BlockingQueue – Producer
Lớp Producer sẽ tạo ra message và thêm vào queue.
package com.journaldev.concurrency;
import java.util.concurrent.BlockingQueue;
public class Producer implements Runnable {
private BlockingQueue<Message> queue;
public Producer(BlockingQueue<Message> q){
this.queue=q;
}
@Override
public void run() {
//produce messages
for(int i=0; i<100; i++){
Message msg = new Message(""+i);
try {
Thread.sleep(i);
queue.put(msg);
System.out.println("Produced "+msg.getMsg());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//adding exit message
Message msg = new Message("exit");
try {
queue.put(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Ví dụ về Java BlockingQueue – Consumer
Lớp Consumer sẽ xử lý message từ queue và kết thúc chương trình khi nhận được message là exit.
package com.journaldev.concurrency;
import java.util.concurrent.BlockingQueue;
public class Consumer implements Runnable{
private BlockingQueue<Message> queue;
public Consumer(BlockingQueue<Message> q){
this.queue=q;
}
@Override
public void run() {
try{
Message msg;
//consuming messages until exit message is received
while((msg = queue.take()).getMsg() !="exit"){
Thread.sleep(10);
System.out.println("Consumed "+msg.getMsg());
}
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
Ví dụ về Java BlockingQueue – Service
Cuối cùng chúng ta sẽ tạo là một service cho producer và consumer. Service này sẽ tạo BlockingQueue với kích thước chỉ định và được truyền vào cho producer consumer. Service này sẽ khởi chạy producer consumer và sau đó là kết thúc chúng.
package com.journaldev.concurrency;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class ProducerConsumerService {
public static void main(String[] args) {
//Creating BlockingQueue of size 10
BlockingQueue<Message> queue = new ArrayBlockingQueue<>(10);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
//starting producer to produce messages in queue
new Thread(producer).start();
//starting consumer to consume messages from queue
new Thread(consumer).start();
System.out.println("Producer and Consumer has been started");
}
}
Kết quả:
Producer and Consumer has been started
Produced 0
Produced 1
Produced 2
Produced 3
Consumed 0
Produced 4
Produced 5
Consumed 1
Produced 6
Produced 7
Consumed 2
Produced 8
Consumed 3
Produced 9
Consumed 4
Produced 10
Consumed 5
Produced 11
Consumed 6
Produced 12
Consumed 7
Consumed 8
Produced 13
Consumed 9
Produced 14
Consumed 10
Consumed 11
Produced 15
Consumed 12
Produced 16
Consumed 13
Produced 17
Consumed 14
Consumed 15
Produced 18
Consumed 16
Consumed 17
Produced 19
Consumed 18
Consumed 19
Produced 20
Consumed 20
Produced 21
Consumed 21
Produced 22
Consumed 22
Produced 23
Consumed 23
Produced 24
Consumed 24
Produced 25
Consumed 25
Produced 26
Consumed 26
Produced 27
Consumed 27
Produced 28
Consumed 28
Produced 29
Consumed 29
Produced 30
Consumed 30
Produced 31
Consumed 31
Produced 32
Consumed 32
Produced 33
Consumed 33
Produced 34
Consumed 34
Produced 35
Consumed 35
Produced 36
Consumed 36
Produced 37
Consumed 37
Produced 38
Consumed 38
Produced 39
Consumed 39
Produced 40
Consumed 40
Produced 41
Consumed 41
Produced 42
Consumed 42
Produced 43
Consumed 43
Produced 44
Consumed 44
Produced 45
Consumed 45
Produced 46
Consumed 46
Produced 47
Consumed 47
Produced 48
Consumed 48
Produced 49
Consumed 49
Produced 50
Consumed 50
Produced 51
Consumed 51
Produced 52
Consumed 52
Produced 53
Consumed 53
Produced 54
Consumed 54
Produced 55
Consumed 55
Produced 56
Consumed 56
Produced 57
Consumed 57
Produced 58
Consumed 58
Produced 59
Consumed 59
Produced 60
Consumed 60
Produced 61
Consumed 61
Produced 62
Consumed 62
Produced 63
Consumed 63
Produced 64
Consumed 64
Produced 65
Consumed 65
Produced 66
Consumed 66
Produced 67
Consumed 67
Produced 68
Consumed 68
Produced 69
Consumed 69
Produced 70
Consumed 70
Produced 71
Consumed 71
Produced 72
Consumed 72
Produced 73
Consumed 73
Produced 74
Consumed 74
Produced 75
Consumed 75
Produced 76
Consumed 76
Produced 77
Consumed 77
Produced 78
Consumed 78
Produced 79
Consumed 79
Produced 80
Consumed 80
Produced 81
Consumed 81
Produced 82
Consumed 82
Produced 83
Consumed 83
Produced 84
Consumed 84
Produced 85
Consumed 85
Produced 86
Consumed 86
Produced 87
Consumed 87
Produced 88
Consumed 88
Produced 89
Consumed 89
Produced 90
Consumed 90
Produced 91
Consumed 91
Produced 92
Consumed 92
Produced 93
Consumed 93
Produced 94
Consumed 94
Produced 95
Consumed 95
Produced 96
Consumed 96
Produced 97
Consumed 97
Produced 98
Consumed 98
Produced 99
Consumed 99
0 comments:
Post a Comment