HTML 标题格式分为$h1$到$h6$六种等级,其中$h1$最大。Markdown 则只支持$h1$和$h2$两级标题。在Markdown中,将#作为标记,一个#代表一级标题,两个#代表二级标题。因此,标题应该以#的数量来表示标题的级别。
详细分析Java并发集合LinkedBlockingQueue的用法
LinkedBlockingQueue概述
Java并发集合LinkedBlockingQueue是一个队列,它支持多线程操作。它的实现基于链表结构,是一个有界的队列,其容量限制可以在创建时指定。LinkedBlockingQueue可以阻塞添加元素和获取元素的线程,因此它可以用于实现生产者-消费者模型。
LinkedBlockingQueue的用法
1. 创建LinkedBlockingQueue
可以通过以下代码创建一个LinkedBlockingQueue,其中参数10代表队列的容量大小。
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(10);
2. 添加元素到队列
可以使用put()方法将元素添加到队列中,如果队列已满,则put()方法将会阻塞线程直到队列有空闲空间。
queue.put("hello");
3.从队列中获取元素
可以使用take()方法从队列中获取元素,如果队列为空,则take()方法将会阻塞线程直到队列中有元素。
String element = queue.take();
4. 查询队列元素个数
可以使用size()方法查询队列中元素的个数。
int size = queue.size();
5. 遍历队列元素
可以使用for each语句遍历队列元素。
for (String element : queue) {
System.out.println(element);
}
LinkedBlockingQueue示例
示例1:生产者-消费者模型
以下代码展示了一个简单的生产者-消费者模型的实现。通过LinkedBlockingQueue可以很方便地实现生产者-消费者模型,其中生产者线程使用put()方法将元素添加到队列中,消费者线程使用take()方法从队列中取出元素。
class Producer implements Runnable {
private LinkedBlockingQueue<String> queue;
public Producer(LinkedBlockingQueue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
String element = "task " + i;
queue.put(element);
System.out.println("producer produced: " + element);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private LinkedBlockingQueue<String> queue;
public Consumer(LinkedBlockingQueue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
try {
String element = queue.take();
System.out.println("consumer consumed: " + element);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class LinkedBlockingQueueDemo {
public static void main(String[] args) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(5);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
}
}
示例2:线程池中使用LinkedBlockingQueue
以下代码展示了如何在线程池中使用LinkedBlockingQueue。当任务队列中的任务达到上限值时,线程池将会阻塞提交任务的线程,直到队列中有空间可以容纳更多的任务。
public class ThreadPoolDemo {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 1000,
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(2));
for (int i = 1; i <= 6; i++) {
executor.execute(new MyTask(i));
System.out.println("线程池中的线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" +
executor.getQueue().size() + ",已执行完别的任务数目:" + executor.getCompletedTaskCount());
}
executor.shutdown();
}
}
class MyTask implements Runnable {
private int taskNum;
public MyTask(int taskNum) {
this.taskNum = taskNum;
}
@Override
public void run() {
System.out.println("正在执行task " + taskNum);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("task " + taskNum + "执行完毕");
}
}
以上就是关于Java并发集合LinkedBlockingQueue的使用方法的详细攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详细分析Java并发集合LinkedBlockingQueue的用法 - Python技术站