黑马程序员--第十篇--银行业务调度系统

本文分享了在ASP.NET、Android和iOS开发领域的培训经历,包括使用synchronized关键字确保线程安全、线程池管理、常量类的使用、业务逻辑封装以及枚举类型的应用等关键技巧。此外,还探讨了如何通过统一业务逻辑和启动器方法来提高代码效率,并介绍了不可重复创建的对象使用枚举的优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我觉得在这里我学习到了一下内容:
1:当两个方法同时修改某一数据时,为了避免数据错误,应该在这两个方法前加synchronized,避免线程的并发。
public synchronized Integer generateNewManage(){
		queueNumber.add(lastNumber);
		return lastNumber++;
	}
	
	public synchronized Integer fetchServiceNumber(){
		if(queueNumber.size() >0)
			return queueNumber.remove(0);
		return null;
	}
同时在网上查了一下synchronized资料
A、synchronized关键字的作用域有二种: 
1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; 
2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。 
B、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象; 
C、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法; 


2:可以使用线程池控制线程,重要的就是这句话Executors.newSingleThreadScheduledExecutor().execute(new Runnable(){      实现run方法      };
Executors.newSingleThreadScheduledExecutor().execute(new Runnable(){

			@Override
			public void run() {
				while(true){
					if(type == CustomerType.COMMON){
						commonService();
					}
					else if(type == CustomerType.EXPRESS){
						expressService();
					}else if(type == CustomerType.VIP){
						vipService();
					}
				}
				
			}

						
		});


3:把经常用的数据写在一个constant类中,里面都是些常量,其它类使用时直接调用。
package com.isoftstone.interview.bank;

public class Constants {
	public static final int  MAX_SERVICE_TIME = 1000;
	public static final int  MIN_SERVICE_TIME = 10000;
	public static final int COMMON_CUSTOMER_INTERVAL_TIME = 1;
}


4:统一业务逻辑上面的写在各个类中,然后写一Main方法作为启动器。
public class Test {
	public static void main(String[] args) {
		
		//数据的验证没有做
		
		ATM atm = new ATM();
		atm.start();
	}
}


5:把不可new的对象写在枚举中,这样省去了很多麻烦,比如季节只有春夏秋冬,十字路口只有红绿黄灯等等。
public enum CustomerType {
	COMMON,EXPRESS,VIP;
	public String toString(){
		if(this == COMMON)
			return "一般";
		else if(this == EXPRESS)
			return "快速";
		else if(this == VIP)
			return "VIP客户";
		return null;
	}
}
在这里经常要重写toString()方法,这个方法容易写错。
6:如果一个快内的代码过多,最好把该代码块写在一个方法内,这样容易修改,也使代码看着整洁。
if(type == CustomerType.COMMON){
						commonService();
					}
private void commonService() {
		String windowName = "第"+windowId+"号"+type+"窗口";
		Integer number = NumberMachine.getInstance().getCommonManager().fetchServiceNumber();
		System.out.println(windowName+"正在获取任务");
		if(number != null){
			long beginTime = System.currentTimeMillis();
			int maxRand = Constants.MAX_SERVICE_TIME-Constants.MIN_SERVICE_TIME;
			long serveTime = new Random().nextInt(maxRand)+1+Constants.MIN_SERVICE_TIME;
			try {
				Thread.sleep(serveTime);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			long costTime = System.currentTimeMillis()-beginTime;
			System.out.println(windowName+"为第"+number+"个"+"普通客户完成服务,耗时"+costTime/1000+"秒");
		}else{
			System.out.println("没有领取到任务,先休息1秒");
			try{
				Thread.sleep(1000);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
		}
	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值