黑马程序员技术交流社区

标题: 多线程中如何有效的同步-已自己解决,同学们可以看一下 [打印本页]

作者: 黑马王冬冬    时间: 2012-8-18 00:52
标题: 多线程中如何有效的同步-已自己解决,同学们可以看一下
本帖最后由 黑马王冬冬 于 2012-8-18 13:25 编辑
  1. public void start(){
  2.       pool.scheduleAtFixedRate(
  3.               new Runnable() {
  4.                       @Override
  5.                        public void run() {
  6.                        // TODO Auto-generated method stub
  7.                         if(tic.getTicNum() <= 0){
  8.                               System.out.println("第" + windowNum + "号窗口" + "门票售罄!");
  9.                                        pool.shutdownNow();
  10.                          }
  11.                                                 else if(((num = cus.serveCustomer()) == -1) && (tic.getTicNum() > 0)){
  12.                                                         System.out.println("第" + windowNum + "号窗口" + "暂无顾客,等待中");
  13.                                                         try {
  14.                                                                 Thread.sleep(1000);
  15.                                                         } catch (InterruptedException e) {
  16.                                                                 // TODO Auto-generated catch block
  17.                                                                 e.printStackTrace();
  18.                                                         }
  19.                                                 }
  20.                                                 else if((tic.getTicNum() > 0)){
  21.                                                         synchronized (tic) {
  22.                                                                 System.out.println("第" + windowNum + "号窗口" + "销售一张门票给第" + num + "位顾客");
  23.                                                                 tic.setTicNum(tic.getTicNum() - 1);//位置1
  24.                                                         }
  25.                                                 }
  26.                                         }
  27.                         },
  28.                         2,
  29.                         1,
  30.                         TimeUnit.MILLISECONDS);
  31.         }
复制代码
同学们,位置1处如何进行有效的同步?加同步代码块以后仍然很神奇的没有起作用,我记得毕老师曾经讲到过,哪位提示一下。

作者: 黑马王冬冬    时间: 2012-8-18 13:23
我找到方法了,将位置一处进行如下修改
else if(tic.getTicNum() > 0){
        synchronized (tic) {
                tic.setTicNum(tic.getTicNum() - 1);//1号
                if(0 <= tic.getTicNum()){
                        System.out.println("第" + windowNum + "号窗口" + "销售一张门票给第" + num + "位顾客");//2号
                       
                        }
                }
        }
在同步方法中添加判断避免重复卖票,并调换1号和2号语句的位置,如果门票的数量不足,则不再卖票。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2