`
jayung
  • 浏览: 59867 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java之多线程以客户去银行存钱为例

 
阅读更多

以客户去银行存钱为例:

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多线程实现银行存款与取款线程

    使用Java多线程,实现模拟银行存款与取款操作的实例。

    java 银行系统多线程

    6. **死锁预防**:在设计多线程银行系统时,要特别注意死锁的问题。死锁是指两个或多个线程互相等待对方释放资源,导致所有线程都无法继续执行。通过合理设计资源获取顺序和使用超时策略,可以避免死锁的发生。 7. ...

    java多线程银行ATM模拟程序

    在Java编程领域,多线程技术是至关重要的一个部分,特别是在设计复杂的系统,如银行ATM模拟程序时。本文将深入探讨如何利用Java实现这样的模拟程序,并涉及与多线程相关的概念。 首先,多线程是指在一个应用程序中...

    简单银行存款取款,以及实现线程java源代码

    在Java编程领域,多线程是并发处理任务的关键技术,特别是在设计复杂的系统,如银行交易系统时。"简单银行存款取款,以及实现线程java源代码"这个项目旨在演示如何利用Java实现银行账户的基本操作——存款和取款,并...

    java多媒体与多线程处理实验

    ### Java多媒体与多线程...通过本次实验,学生不仅掌握了Java多线程编程的基础知识,还学会了如何利用多线程优化程序性能,特别是在多媒体应用领域,如动画、音视频处理等,为后续更复杂的应用开发奠定了坚实的基础。

    JAVA多线程的一个带UI界面的例子

    在Java编程中,多线程是一项关键特性,...总之,这个"JAVA多线程的一个带UI界面的例子"涵盖了Java多线程编程和GUI设计的核心概念,通过实际的代码示例,有助于开发者深入理解如何在实际应用中正确、高效地使用多线程。

    以银行取钱为例模拟Java多线程同步问题完整代码

    本文主要介绍了Java 多线程同步问题完整代码,以银行取钱为例,通过代码实例来演示多线程同步问题的解决方案。多线程同步是指在同一程序中有多个顺序流在执行,并且这些顺序流之间需要共享资源或数据。 在操作系统...

    使用Java多线程的同步机制编写应用程序.docx

    在本实验中,我们主要探讨了Java多线程的同步机制以及其在并发编程中的应用。实验目的是理解和掌握并行/并发、同步/异步的概念,并通过实现一个模拟银行账户的程序来具体应用这些概念。 首先,理解并行/并发是关键...

    用java多线程做的银行汇款问题

    3.假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。现有两个顾客, //每人都分3次,每次100元将钱到入。 试编写一个程序,模拟实际作业。

    java多线程1

    ### Java多线程基础 在Java中,多线程是通过`Thread`类来实现的。`Thread`类提供了一种创建并发执行路径的方式,即所谓的“线程”。在多线程环境中,多个线程可以同时运行,从而提高程序的执行效率。然而,在实际...

    java 多线程同步方法的实例

    在Java编程语言中,多...同时,理解并掌握这些同步机制的原理和使用场景,对于提升Java多线程编程的能力至关重要。在实际开发中,要特别注意死锁、活锁和饥饿等问题,避免因线程同步不当而导致的性能下降或程序错误。

    Java时序银行系统.zip

    在银行系统中,每个客户请求(存款或取款)可以被视为一个独立的线程,这些线程并行运行,使得系统能处理更多的事务,提高服务效率。 在Java中,创建线程主要有两种方式:继承`Thread`类或者实现`Runnable`接口。...

    java_ten.rar_java银行

    通过这个项目,开发者不仅可以深入理解Java多线程的原理和实践,还能学习到如何在实际场景中应用这些知识,解决并发问题,提升程序的效率和安全性。同时,这也是对Java面向对象设计、异常处理和并发控制能力的一次...

    java银行存款系统,连接MySQL数据库

    7. **多线程**:为了提高用户体验,银行存款系统可能采用多线程技术,让用户在等待某些耗时操作(如数据库查询)时,可以进行其他操作,而不阻塞整个应用程序。 8. **安全性**:由于涉及金钱交易,系统的安全性至关...

    java多线程网络编程实现ATM自动取款机系统

    Java多线程网络编程在实现ATM自动取款机系统中的应用主要涉及到以下几个核心知识点: 1. **Java多线程**:多线程是Java语言的重要特性,它允许多个任务在同一时间执行,提高程序效率。在ATM系统中,每个用户操作...

    银行账户管理 JAVA

    总结,一个完整的银行账户管理系统利用Java的强大功能,结合数据库操作、异常处理、安全性措施以及可能的多线程设计,可以高效、安全地满足用户的需求。而实际开发中,还需要考虑到性能优化、测试和持续集成等方面,...

    Java模拟银行小项目.zip

    Java提供了丰富的多线程支持,如`Thread`类和`Runnable`接口,可以用来实现并发操作,保证各个操作的独立性和互不影响。 5. **集合框架**:存储和管理用户和账户信息可能需要用到Java的集合框架,如`ArrayList`、`...

    银行管理系统JAVA程序

    - 银行系统可能涉及并发操作,如多个用户同时进行交易,Java的多线程机制能有效处理这种情况,保证数据的一致性和完整性。 7. **安全措施**: - 用户密码的加密存储,防止数据泄露。 - 使用HTTPS协议进行通信,...

    java实现的银行系统

    这样的系统对于学习Java的程序员来说是一个宝贵的资源,因为它提供了实际项目中的代码实例,有助于理解面向对象设计、数据库交互以及多线程等核心Java概念。 1. **面向对象设计**:银行系统的实现会涉及到多个类的...

    Java实现银行存取款

    Java实现银行存取款 Java实现银行存取款是一种使用Java语言实现的银行存取款系统。这种系统可以模拟真实世界中的银行存取款操作,...* Java多线程编程指南 * Java同步机制详解 * Java语言基础教程 * 面向对象编程原理

Global site tag (gtag.js) - Google Analytics