This article mainly introduces the detailed explanation and examples of the blocking queue BlockingQueue in java. Friends who need it can refer to
The detailed explanation and examples of the blocking queue BlockingQueue in java
BlockingQueue is a good solution to the transmission of data in multi-threads. First of all, BlockingQueue is an interface. It has roughly four implementation classes. This is a very special queue. If the BlockQueue is empty, the operation of getting things from the BlockingQueue is Will be blocked and enter the waiting state, and will not be awakened until the BlockingQueue has something in it. Similarly, if the BlockingQueue is full, any operation that attempts to store something in it will also be blocked and enter the waiting state, and will not be awakened until there is space in the BlockingQueue. will be awakened to continue the operation.
Four implementation classes of BlockingQueue:
1.ArrayBlockingQueue: A BlockingQueue with a specified size. Its constructor must take an int parameter to indicate its size. It contains The objects are sorted in FIFO (first in, first out) order.
2. LinkedBlockingQueue: BlockingQueue of variable size. If its constructor takes a parameter with a specified size, the generated BlockingQueue has a size limit. If there is no size parameter, the size of the generated BlockingQueue is determined by Integer.MAX_VALUE. The objects it contains are sorted in FIFO (first in, first out) order
3.PriorityBlockingQueue: similar to LinkedBlockQueue, but the sorting of the objects it contains is not FIFO, but based on the natural sorting order of the objects or the order determined by the Comparator of the constructor.
4.SynchronousQueue: a special BlockingQueue, for which The operation must be completed alternately by putting and taking.
Common methods of BlockingQueue:
1)add(anObject): Add anObject to the BlockingQueue, that is, if the BlockingQueue If it can be accommodated, return true, otherwise an exception will be reported
2) offer(anObject): Indicates that if possible, add anObject to the BlockingQueue, that is, if the BlockingQueue can accommodate it, return true, otherwise return false.
3)put(anObject): Add anObject to the BlockingQueue. If there is no space in the BlockQueue, the thread calling this method will be blocked until there is space in the BlockingQueue before continuing.
4)poll(time): Take away the first object in the BlockingQueue. If it cannot be taken out immediately, you can wait for the time specified by the time parameter. If it cannot be taken out, return null
5)take(): Take the first object in the BlockingQueue. If the BlockingQueue is empty, the block will enter the waiting state until new objects are added to the Blocking
Example:
This example mainly simulates the workflow between producers and consumers. It is a simple scenario where consumers wait for producers to produce products for consumers to consume.
Producer:
package com.gefufeng; import java.util.concurrent.BlockingQueue; public class Producter implements Runnable{ private BlockingQueue<String> blockingQueue; public Producter(BlockingQueue<String> blockingQueue){ this.blockingQueue = blockingQueue; } @Override public void run() { try { blockingQueue.put("我生产的" + Thread.currentThread().getName()); System.out.println("我生产的" + Thread.currentThread().getName()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("生产失败"); } } }
Consumer:
package com.gefufeng; import java.util.concurrent.BlockingQueue; public class Customer implements Runnable{ private BlockingQueue<String> blockingQueue; public Customer(BlockingQueue<String> blockingQueue){ this.blockingQueue = blockingQueue; } @Override public void run() { for(;;){ try { String threadName = blockingQueue.take(); System.out.println("取出:" + threadName); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("取出失败"); } } } }
Execution class:
package com.gefufeng; import java.util.concurrent.ArrayBlockingQueue; public class Executer { public static void main(String[] args) { ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(2); Producter producter = new Producter(arrayBlockingQueue); Customer cusotmer = new Customer(arrayBlockingQueue); new Thread(cusotmer).start(); for(;;){ try { Thread.sleep(2000); new Thread(producter).start(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
First, the consumer waits for the product in a loop, When blockingQueue.take() is executed for the first time in the loop, no product can be produced, so it enters the blocking state. Two seconds later, the producer produces a product, so the blockingQueue gets the product, prints the log, and then the consumer After executing the second loop, it was found that blockingQueue.take() did not get the product again, so it entered the blocking state again. . . Loop in sequence
The above is the detailed content of Detailed explanation of blocking queue BlockingQueue examples in java. For more information, please follow other related articles on the PHP Chinese website!