您的位置:首页 > 职场人生

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

2014-01-17 22:55 639 查看
ASP.Net+Android+IOS开发.Net培训期待与您交流!
我觉得在这里我学习到了一下内容:
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();
}
}
}


ASP.Net+Android+IOS开发.Net培训期待与您交流!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: