黑马程序员--第十篇--银行业务调度系统
2014-01-17 22:55
639 查看
ASP.Net+Android+IOS开发.Net培训期待与您交流!
我觉得在这里我学习到了一下内容:
1:当两个方法同时修改某一数据时,为了避免数据错误,应该在这两个方法前加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方法 };
3:把经常用的数据写在一个constant类中,里面都是些常量,其它类使用时直接调用。
4:统一业务逻辑上面的写在各个类中,然后写一Main方法作为启动器。
5:把不可new的对象写在枚举中,这样省去了很多麻烦,比如季节只有春夏秋冬,十字路口只有红绿黄灯等等。
6:如果一个快内的代码过多,最好把该代码块写在一个方法内,这样容易修改,也使代码看着整洁。
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培训期待与您交流!
相关文章推荐
- 黑马程序员——银行业务调度系统
- 黑马程序员-----高薪面试题-银行业务调度系统
- 黑马程序员_学习日记_银行业务调度系统
- 黑马程序员——银行业务调度系统
- 黑马程序员_7K面试题--银行业务调度系统
- 黑马程序员-12 7k面试题银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员<银行业务调度系统>
- 黑马程序员22——银行业务调度系统
- 黑马程序员--银行业务调度系统--java学习日记14(7K)
- 黑马程序员 银行业务调度系统
- 黑马程序员_交通灯管理系统、银行业务调度系统及自己总结的
- 黑马程序员_银行业务调度系统
- 黑马程序员_7K面试题之银行业务调度系统
- 黑马程序员-----张孝祥-7K月薪面试题破解之二_银行业务调度系统视频教程观后总结
- 黑马程序员----银行业务调度系统
- 黑马程序员-银行业务调度系统
- 黑马程序员_银行业务调度系统
- 黑马程序员:7K面试题之银行业务调度系统
- 黑马程序员_银行业务调度系统