网站首页 > java教程 正文
一个简单的Java并发编程实践案例是使用多线程实现顾客排队系统。
在这个案例中,我们可以创建一个有限容量的阻塞队列CustomerLine,用于模拟顾客的排队队列。然后,我们可以创建两个线程,一个代表顾客CustomerGenerator,另一个代表出纳员Teller。
CustomerGenerator线程会生成一定数量的顾客,并将他们加入到CustomerLine中。Teller线程则会从CustomerLine中取出顾客进行服务。在这个过程中,我们可以通过使用synchronized关键字或者Lock来实现线程间的同步和协作。
这个案例可以帮助我们理解Java并发编程中的线程同步和通信机制,以及如何使用Java提供的并发工具类来实现这些机制。同时,我们也可以通过这个案例来学习如何设计并发程序,以及如何优化程序的性能和响应速度。
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
class Customer {
private String name;
public Customer(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class CustomerGenerator extends Thread {
private BlockingQueue<Customer> queue;
private int maxCustomers;
public CustomerGenerator(BlockingQueue<Customer> queue, int maxCustomers) {
this.queue = queue;
this.maxCustomers = maxCustomers;
}
@Override
public void run() {
for (int i = 0; i < maxCustomers; i++) {
try {
Thread.sleep(1000); // 休眠一段时间来模拟顾客的生成过程
queue.put(new Customer("Customer " + i)); // 将顾客加入到队列中
System.out.println("Generated customer: " + queue.take().getName()); // 打印生成顾客的信息,这里使用队列的take方法来阻塞等待队列非空
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Teller extends Thread {
private BlockingQueue<Customer> queue;
public Teller(BlockingQueue<Customer> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
try {
Customer customer = queue.take(); // 从队列中取出顾客进行服务,这里使用队列的take方法来阻塞等待队列非空
System.out.println("Serviced customer: " + customer.getName()); // 打印服务顾客的信息
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ConcurrencyExample {
public static void main(String[] args) {
int maxCustomers = 10; // 最大顾客数量为10
BlockingQueue<Customer> queue = new LinkedBlockingQueue<>(maxCustomers); // 使用阻塞队列来模拟排队队列,容量为maxCustomers
CustomerGenerator generator = new CustomerGenerator(queue, maxCustomers); // 创建顾客生成线程,将生成的顾客加入到队列中
Teller teller = new Teller(queue); // 创建出纳员线程,从队列中取出顾客进行服务
generator.start(); // 启动顾客生成线程,生成一定数量的顾客并加入到队列中,直到队列满为止(阻塞等待)
teller.start(); // 启动出纳员线程,从队列中取出顾客进行服务,直到程序退出(无限循环)
}
}
猜你喜欢
- 2024-10-25 java 并发编程实战(第二章)(java并发编程深度解析)
- 2024-10-25 Java 多线程并发编程面试笔录一览
- 2024-10-25 我和面试官的博弈:Java 并发编程篇
- 2024-10-25 清华大牛出版的java并发编程从入门到精通,不要让它继续蒙灰了
- 2024-10-25 JAVA多线程并发编程-避坑指南(java多线程并发调用接口)
- 2024-10-25 阿里大神再秀神作!凭借“347页核心笔记”带你玩转并发编程
- 2024-10-25 Java并发编程实战:深入理解线程池
- 2024-10-25 2020程序员都在看的PDF:《Java 多线程编程实战指南(核心篇)》
- 2024-10-25 Java并发编程(一)-Java线程状态及其转换(理论+实战)
- 2024-10-25 12W字!阿里P8架构师手写“Java并发手册”带你横扫全网
你 发表评论:
欢迎- 最近发表
-
- Java内存溢出紧急处理:10个必知的Linux命令快速定位OOM
- 面试常问的 25+ 个 Linux 命令(linux面试命令大全)
- Java堆外内存溢出紧急处理实战:Linux命令定位与Spring Boot解决
- java开发常用的Linux命令,高频的没你想象的多
- Java 应用 CPU 飙升?8 个 Linux 命令组合拳快速锁定异常线程
- Java 开发者线上问题排查常用的 15 个 Linux 命令
- Java程序员必备的Linux命令:让你的工作效率翻倍
- Java程序员必备的Linux命令全解析
- [超全整理] Java 程序员必备的 100 条 Linux 命令大全
- SAP ABAP资源导航(sap aatp)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)