A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢毅 中级黑马   /  2013-1-16 20:13  /  2260 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 谢毅 于 2013-1-17 16:40 编辑

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
                        public void run() {
                                Integer number = NumberMachine.getInstance().getCommonManager()
                                                .generateNewManager();
                                System.out.println(number + "号普通客户等待服务");
                        }
                }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME, TimeUnit.SECONDS);
                Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
                        public void run() {
                                Integer number = NumberMachine.getInstance()
                                                .getExpressManager().generateNewManager();
                                System.out.println(number + "号快速客户等待服务");
                        }
                }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 2, TimeUnit.SECONDS);
                Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
                        public void run() {
                                Integer number = NumberMachine.getInstance().getVipManager()
                                                .generateNewManager();
                                System.out.println(number + "号VIP客户等待服务");
                        }
                }, 0, Constants.COMMON_CUSTOMER_INTERVAL_TIME * 6, TimeUnit.SECONDS);

3个调度线程需要进行同步,老张也说过,不过说用两个锁去做很可能死锁,因为其中的generateNewManager()也是阻塞状态。
我想了下是不是可以用Lock和Condition去取代两个锁,不过还没实现,求各位大虾建议

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

5 个回复

倒序浏览
楼主你可以去看一下API 这个类 Executors的 newScheduledThreadPool这个静态方法,很犀利的。
会自动释放线程池的,专门用于多线程同时执行时,自动释放等待线程的,不会出现的哦。
回复 使用道具 举报
银行业务系统我记得是将获取号码的两个方法进行了同步,而Numbermachine里并没有进行同步,只是建了三个对象,并且NumberMachine使用单利模式,所以,并不存在你说的问题莫,如果要用Lock锁的话,只要将生成号码和获得号码进行加锁。由于我记得不是很清楚了,如果号码是在一个ArrayList保存,那么将这个List是为监听对象即可。

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
王阳 发表于 2013-1-16 21:33
银行业务系统我记得是将获取号码的两个方法进行了同步,而Numbermachine里并没有进行同步,只是建了三个对象, ...

MainClass启动类里,分别开辟了3个调度线程来供3种客户取号,这里应该要同步的,因为只有一台机子可供操作,每个取号线程里又调用了NumberManager类的号码生成方法,这个方法也是被同步了的,所以我说出现了两个锁
回复 使用道具 举报
谢毅 发表于 2013-1-16 21:45
MainClass启动类里,分别开辟了3个调度线程来供3种客户取号,这里应该要同步的,因为只有一台机子可供操 ...

是的,所以我不是说了莫,Numbermachine里面分别实现了三个对象,而NumberMachnie又是单利模式,所以不会出现什么问题。因为NumberMachine只会有一个实例对象,那么对应的三个取号对象都是唯一的。何来需要同步呢?只需要同步方法即可
回复 使用道具 举报
焦健 来自手机 高级黑马 2013-1-17 10:45:15
地板
王阳 发表于 2013-1-16 22:28:29

是的,所以我不是说了莫,Numbermachine里面分别实现了三个对象,而NumberMachnie又是单利模式,所以不会出现什么问题。因为NumberMachine只会有一个实例对象,那么对应的

不对吧,张老师的意思是在获取要服务的号码以后在这里线程就停止了,有可能并没有直接输出某某等待服务这一输出语句!!来自: Android客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马