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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© momoxixi 中级黑马   /  2015-11-19 11:43  /  709 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么这段代码 执行下来,全是线程1在执行sellTicket(),另外两个线程一直没能执行sellTicket方法 这是为什么?
  1. package javamutithreading;

  2. /**
  3. * Created by mo on 15/11/18.
  4. * 电影院100张票,3个窗口同时卖,请设计程序实现
  5. */
  6. public class SaleTicker2 {
  7.     public static void main(String[] args) {
  8.         SaleTickets1 s = new SaleTickets1();

  9.         Thread t1 = new Thread(s,"no.1");
  10.         Thread t2 = new Thread(s,"no.2");
  11.         Thread t3 = new Thread(s,"no.3");

  12.         t1.start();
  13.         t2.start();
  14.         t3.start();
  15.     }
  16. }

  17. class SaleTickets1 implements Runnable{
  18.     private static int num = 100;


  19.     @Override
  20.     public void run() {


  21.         while (num>0){

  22.             sellTicket();
  23.         }


  24.     }
  25.     //同步方法
  26.     private synchronized void sellTicket(){

  27.         if (num>0) {
  28.             try {
  29.                 Thread.sleep(10);
  30.             } catch (InterruptedException e) {
  31.                 System.out.println("停止售票");
  32.             }
  33.             num--;
  34.             System.out.println(Thread.currentThread().getName() + "窗口卖出一张,剩余" + num + "张"+"by同步方法");
  35.         }

  36.     }
  37. }
复制代码

7 个回复

倒序浏览
no.1给锁上了,别的再使用都是锁状态,怎么执行呢?
回复 使用道具 举报
每一条线程应该是一个不同的SaleTickets1对象吧
回复 使用道具 举报
洛荣神川 发表于 2015-11-19 12:06
no.1给锁上了,别的再使用都是锁状态,怎么执行呢?

no.1执行完方法 不就归还钥匙了吗?然后三个线程再抢钥匙?
回复 使用道具 举报
你的代码没有问题,我调试正确,代码稍微改下就直观了
  1. class SaleTickets1 implements Runnable{
  2.     private static int num = 100;


  3.     public void run() {


  4.         while (num>0){
  5.                
  6.             sellTicket();
  7.             try {
  8.                                 Thread.sleep(10);  //加入代码
  9.                         } catch (InterruptedException e) {
  10.                                 e.printStackTrace();
  11.                         }
  12.         }


  13.     }
复制代码


输出:
  1. no.1窗口卖出一张,剩余99张by同步方法
  2. no.3窗口卖出一张,剩余98张by同步方法
  3. no.2窗口卖出一张,剩余97张by同步方法
  4. no.3窗口卖出一张,剩余96张by同步方法
  5. no.1窗口卖出一张,剩余95张by同步方法
  6. no.3窗口卖出一张,剩余94张by同步方法
  7. no.2窗口卖出一张,剩余93张by同步方法
  8. no.3窗口卖出一张,剩余92张by同步方法
  9. no.1窗口卖出一张,剩余91张by同步方法
  10. no.3窗口卖出一张,剩余90张by同步方法
  11. no.2窗口卖出一张,剩余89张by同步方法
  12. no.3窗口卖出一张,剩余88张by同步方法
  13. no.1窗口卖出一张,剩余87张by同步方法
  14. no.3窗口卖出一张,剩余86张by同步方法
  15. //下面省略
复制代码

回复 使用道具 举报
代码是没有问题的,只是100张票太少了,显示不出效果,所以看起来只有一个线程在执行。如楼上所说,可以在调用sellTicket()函数前加一个延时,就可以看到效果了。
回复 使用道具 举报
hbcoding 发表于 2015-11-19 15:23
代码是没有问题的,只是100张票太少了,显示不出效果,所以看起来只有一个线程在执行。如楼上所说,可以在 ...

果然..设1000张票就有别的线程参与进来了
回复 使用道具 举报
这也主要跟电脑配置有关系  有的配置好的运行速度太快 你的数据又太小  所以根本看不到想要的效果
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马