武汉理工大学面向对象多线程源代码
时间: 2024-12-30 10:16:59 浏览: 14
### 武汉理工大学面向对象多线程编程源代码示例
在探讨武汉理工大学关于面向对象与多线程编程的教学实践中,可以构建一个简单的Java应用程序来展示如何实现这一概念[^1]。
下面是一个基于Java的简单银行账户管理系统案例研究,该系统利用了面向对象特性和多线程技术:
```java
// 定义Account类作为抽象基类
public abstract class Account {
protected double balance;
public synchronized void withdraw(double amount) throws InterruptedException {
while (balance < amount) {
wait();
}
balance -= amount;
System.out.println(Thread.currentThread().getName() + " withdrew " + amount);
notifyAll(); // 唤醒其他等待中的线程
}
public synchronized void deposit(double amount) throws InterruptedException {
Thread.sleep(10); // 模拟处理时间
balance += amount;
System.out.println(Thread.currentThread().getName() + " deposited " + amount);
notifyAll(); // 唤醒其他等待中的线程
}
public double getBalance() {
return balance;
}
}
// 继承自Account的具体子类CheckingAccount
class CheckingAccount extends Account {
public CheckingAccount(double initialDeposit) {
this.balance = initialDeposit;
}
}
```
此代码片段展示了面向对象设计原则的应用——通过创建`Account`父类及其具体实现`CheckingAccount`。同时,在方法内部使用`synchronized`关键字确保同一时刻只有一个线程能够访问共享资源(即账户余额),从而防止并发冲突并保障数据一致性。
为了进一步说明多线程环境下的操作,这里定义两个辅助函数用于模拟存款和取款行为:
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class BankSystemDemo {
private static final int THREAD_COUNT = 5; // 设置线程池大小
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
CheckingAccount account = new CheckingAccount(1000.0);
Runnable taskWithdraw = () -> {
try {
account.withdraw(Math.random()*200+100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
};
Runnable taskDeposit = () -> {
try {
account.deposit(Math.random()*300+100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
};
for(int i=0;i<10;i++){
executor.submit(taskWithdraw);
executor.submit(taskDeposit);
}
executor.shutdown();
while (!executor.isTerminated()) {}
System.out.printf("Final Balance: %.2f\n",account.getBalance());
}
}
```
上述程序创建了一个固定数量的工作线程组成的线程池,并提交多个存入和取出的任务给这些工作线程执行。当所有任务完成后,主线程会打印最终账户余额。这种方式不仅体现了面向对象的设计理念,还有效解决了多线程环境下资源共享的问题。
阅读全文