并发编程:Java线程池和阻塞队列示例
在Java中,线程池和阻塞队列是处理并发的两种常用工具。
- Java线程池(ThreadPoolExecutor)
线程池是一种资源管理方式,它维护一组工作线程,这些线程可以重复使用,而不需要每次请求一个新的线程。
示例代码:
// 创建一个线程池
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
// 提交任务到线程池
executor.execute(new Runnable() {
@Override
public void run() {
// 这里是你的任务逻辑
}
}));
- Java阻塞队列(BlockingQueue)
阻塞队列是一种先进先出(FIFO)的多生产者、单消费者或无生产者、多个消费者的并发数据结构。
示例代码:
// 创建一个固定大小为10的阻塞队列
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);
// 生产者向队列中添加元素
new Thread(() -> {
for (int i = 0; i < 20; i++) {
if (!queue.offer(i)) { // 如果不能立即添加,将阻塞到有空间为止
System.out.println("Adding to queue is blocked due to capacity.");
break;
}
}
})}.start();
// 消费者从队列中获取元素并处理它们
new Thread(() -> {
while (!queue.isEmpty()) { // 如果队列为空,将阻塞到有元素为止
int item = queue.poll(); // 从队列中取出一个元素,并处理它
if (item % 2 == 0) { // 对偶的条件
System.out.println("Item " + item + " is even.");
} else {
System.out.println("Item " + item + " is odd.");
}
}
})}.start();
在这个示例中,我们创建了一个固定大小为10的阻塞队列。生产者向队列中添加元素,而消费者从队列中获取并处理这些元素。如果队列已满,生产者将被阻塞;如果队列为空,消费者将被阻塞。
还没有评论,来说两句吧...