以客户去银行存钱为例:
1. 客户通过排队取号来办法存钱业务,这里就有一个队列的,而且是阻塞的,因为只有排在前面的客户办完业务之后才能轮到后面的客户,
2. 柜员工作人员比作为多个线程,多个线程同时运行,取队列里的客户,并为其办法存钱业务。
public class Customer { /** 客户名 */ private String name; /** 存钱数 */ private int savings; public Customer(String name, int savings) { this.name = name; this.savings = savings; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSavings() { return savings; } public void setSavings(int savings) { this.savings = savings; } public String toString() { return "Customer [name=" + name + "]"; } }
柜台工作人员:Counter
public class Counter implements Runnable { Bank bank = Bank.getInstance(); private String name; private String state; private int count = 0; public Counter( ) { this.state = CounterState.AVAILABLE; } public Counter(String name) { this.name = name; this.state = CounterState.AVAILABLE; } public void deposit(Customer c) { System.out.println(System.currentTimeMillis() +":【" + Thread.currentThread().getName() + "】" + ":开始给【" + c.getName() + "】存钱"); this.setState(CounterState.BUSY); try { Thread.sleep((long) (Math.random() * 100)); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (Counter.class) { bank.setTotalDeposit(Bank.getInstance().getTotalDeposit() + c.getSavings()); } System.out.println(System.currentTimeMillis() +":【" + Thread.currentThread().getName() + "】" + ":给【" + c.getName() + "】存钱完毕!"); this.setState(CounterState.AVAILABLE); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getState() { return state; } public void setState(String state) { this.state = state; } public void run() { exec(); } public void exec() { while (Bank.getInstance().getQueue() != null && !Bank.getInstance().getQueue().isEmpty()) { if (CounterState.AVAILABLE.equals(this.getState())) { Customer c = Bank.getInstance().getQueue().poll(); this.deposit(c); } else { //System.out.println("" + Thread.currentThread().getName() + "还在给别人存钱"); } } this.setState(CounterState.OFFWORK); System.out.println(Thread.currentThread().getName() + "下班..."); } public int getCount() { return count; } public void setCount(int count) { this.count = count; } }
银行网点(单例):
public class Bank { private volatile static Bank bank; private int totalDeposit = 0; private Queue<Customer> queue; public static Bank getInstance() { if (bank == null) { synchronized (Bank.class) { bank = new Bank(); } } return bank; } private Bank() { } public int getTotalDeposit() { return totalDeposit; } public void setTotalDeposit(int totalDeposit) { this.totalDeposit = totalDeposit; } public Queue<Customer> getQueue() { return queue; } public void setQueue(Queue<Customer> queue) { this.queue = queue; } }
主线程:
public class Deposit { public static void main(String[] args) { long start = System.currentTimeMillis(); Queue<Customer> q = new ConcurrentLinkedQueue<Customer>(); for (int i = 1; i <= 1000; i++) { q.add(new Customer("客户" + i, i)); } Bank.getInstance().setQueue(q); Counter[] counters = new Counter[10]; Thread[] threads = new Thread[10]; for(int i = 0;i<counters.length;i++) { counters[i] = new Counter("Counter"+i); threads[i] = new Thread(counters[i]); threads[i].setName("Thread" + i); threads[i].start(); } while(true) { if(q.isEmpty()) { boolean flag = true; for (int j = 0; j < counters.length; j++) { if(!CounterState.OFFWORK.equals(counters[j].getState()) ){ flag = false; } } if(flag) { break; } } } System.out.println("所有队伍已排完,并且柜员处理完所有客户的存款,总共存钱:" + Bank.getInstance().getTotalDeposit()); System.out.println("总用时:" + (System.currentTimeMillis() - start)); } }
相关推荐
使用Java多线程,实现模拟银行存款与取款操作的实例。
6. **死锁预防**:在设计多线程银行系统时,要特别注意死锁的问题。死锁是指两个或多个线程互相等待对方释放资源,导致所有线程都无法继续执行。通过合理设计资源获取顺序和使用超时策略,可以避免死锁的发生。 7. ...
在Java编程领域,多线程技术是至关重要的一个部分,特别是在设计复杂的系统,如银行ATM模拟程序时。本文将深入探讨如何利用Java实现这样的模拟程序,并涉及与多线程相关的概念。 首先,多线程是指在一个应用程序中...
在Java编程领域,多线程是并发处理任务的关键技术,特别是在设计复杂的系统,如银行交易系统时。"简单银行存款取款,以及实现线程java源代码"这个项目旨在演示如何利用Java实现银行账户的基本操作——存款和取款,并...
### Java多媒体与多线程...通过本次实验,学生不仅掌握了Java多线程编程的基础知识,还学会了如何利用多线程优化程序性能,特别是在多媒体应用领域,如动画、音视频处理等,为后续更复杂的应用开发奠定了坚实的基础。
在Java编程中,多线程是一项关键特性,...总之,这个"JAVA多线程的一个带UI界面的例子"涵盖了Java多线程编程和GUI设计的核心概念,通过实际的代码示例,有助于开发者深入理解如何在实际应用中正确、高效地使用多线程。
本文主要介绍了Java 多线程同步问题完整代码,以银行取钱为例,通过代码实例来演示多线程同步问题的解决方案。多线程同步是指在同一程序中有多个顺序流在执行,并且这些顺序流之间需要共享资源或数据。 在操作系统...
在本实验中,我们主要探讨了Java多线程的同步机制以及其在并发编程中的应用。实验目的是理解和掌握并行/并发、同步/异步的概念,并通过实现一个模拟银行账户的程序来具体应用这些概念。 首先,理解并行/并发是关键...
3.假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。现有两个顾客, //每人都分3次,每次100元将钱到入。 试编写一个程序,模拟实际作业。
### Java多线程基础 在Java中,多线程是通过`Thread`类来实现的。`Thread`类提供了一种创建并发执行路径的方式,即所谓的“线程”。在多线程环境中,多个线程可以同时运行,从而提高程序的执行效率。然而,在实际...
在Java编程语言中,多...同时,理解并掌握这些同步机制的原理和使用场景,对于提升Java多线程编程的能力至关重要。在实际开发中,要特别注意死锁、活锁和饥饿等问题,避免因线程同步不当而导致的性能下降或程序错误。
在银行系统中,每个客户请求(存款或取款)可以被视为一个独立的线程,这些线程并行运行,使得系统能处理更多的事务,提高服务效率。 在Java中,创建线程主要有两种方式:继承`Thread`类或者实现`Runnable`接口。...
通过这个项目,开发者不仅可以深入理解Java多线程的原理和实践,还能学习到如何在实际场景中应用这些知识,解决并发问题,提升程序的效率和安全性。同时,这也是对Java面向对象设计、异常处理和并发控制能力的一次...
7. **多线程**:为了提高用户体验,银行存款系统可能采用多线程技术,让用户在等待某些耗时操作(如数据库查询)时,可以进行其他操作,而不阻塞整个应用程序。 8. **安全性**:由于涉及金钱交易,系统的安全性至关...
Java多线程网络编程在实现ATM自动取款机系统中的应用主要涉及到以下几个核心知识点: 1. **Java多线程**:多线程是Java语言的重要特性,它允许多个任务在同一时间执行,提高程序效率。在ATM系统中,每个用户操作...
总结,一个完整的银行账户管理系统利用Java的强大功能,结合数据库操作、异常处理、安全性措施以及可能的多线程设计,可以高效、安全地满足用户的需求。而实际开发中,还需要考虑到性能优化、测试和持续集成等方面,...
Java提供了丰富的多线程支持,如`Thread`类和`Runnable`接口,可以用来实现并发操作,保证各个操作的独立性和互不影响。 5. **集合框架**:存储和管理用户和账户信息可能需要用到Java的集合框架,如`ArrayList`、`...
- 银行系统可能涉及并发操作,如多个用户同时进行交易,Java的多线程机制能有效处理这种情况,保证数据的一致性和完整性。 7. **安全措施**: - 用户密码的加密存储,防止数据泄露。 - 使用HTTPS协议进行通信,...
这样的系统对于学习Java的程序员来说是一个宝贵的资源,因为它提供了实际项目中的代码实例,有助于理解面向对象设计、数据库交互以及多线程等核心Java概念。 1. **面向对象设计**:银行系统的实现会涉及到多个类的...
Java实现银行存取款 Java实现银行存取款是一种使用Java语言实现的银行存取款系统。这种系统可以模拟真实世界中的银行存取款操作,...* Java多线程编程指南 * Java同步机制详解 * Java语言基础教程 * 面向对象编程原理