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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zl78365336 中级黑马   /  2013-12-7 23:42  /  1280 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zl78365336 于 2013-12-8 17:17 编辑


售票的代码,出了什么问题,怎样完善代码?


  1. import java.util.concurrent.Executors;

  2. public class TicketTest {
  3.         public static void main(String[] args) {
  4.                 Ticket ticket = Ticket.getInstance();
  5.                 ticket.setNumber(100);
  6.                 new SealWindow("1号窗口").start();  
  7.                 new SealWindow("2号窗口").start();
  8.                 new SealWindow("3号窗口").start();  
  9.                 new SealWindow("4号窗口").start();  
  10.         }
  11. }  
  12. class Ticket {
  13.         private static Ticket ticket = new Ticket();
  14.         private Ticket() { }  
  15.         public static Ticket getInstance() {  
  16.                 return ticket;
  17.         }  
  18.         private int number;  

  19.         public boolean isHasTicket() {
  20.                 if (number > 0)
  21.                         return true;
  22.                 return false;
  23.         }  
  24.         public void sealTicket() {
  25.                 number--;
  26.         }
  27.         
  28.         public void setNumber(int number) {
  29.                 this.number = number;
  30.         }   
  31.         public int getNumber() {  
  32.                 return number;
  33.         }         
  34. }
  35. class SealWindow {  
  36.         private String name;  
  37.         public SealWindow(String name) {
  38.                 this.name = name;
  39.         }  
  40.         public void start() {
  41.                 Executors.newScheduledThreadPool(1).execute(new Runnable() {
  42.                         Ticket ticket = Ticket.getInstance();
  43.                         @Override  
  44.                         public void run() {  
  45.                                 while (ticket.isHasTicket()) {
  46.                                         synchronized (Ticket.class) {
  47.                                                 if(!ticket.isHasTicket())continue;
  48.                                                 try {
  49.                                                         Thread.sleep(10);
  50.                                                 } catch (InterruptedException e) {
  51.                                                         e.printStackTrace();
  52.                                                 }
  53.                                                 ticket.sealTicket();
  54.                                                 System.out.println(name + "售出" + (ticket.getNumber() + 1) + "号票");
  55.                                         }
  56.                                 }  
  57.                         }
  58.                 });
  59.         }
  60.         }   
  61. class TicketSealCenter { }



复制代码

5 个回复

倒序浏览
你这个运行起来没有问题,1到100号票都打印了,4个窗口都运行了,也没有出现0号票的情况
回复 使用道具 举报
橸瑩膤漃寞林 发表于 2013-12-8 15:39
你这个运行起来没有问题,1到100号票都打印了,4个窗口都运行了,也没有出现0号票的情况 ...

程序停不了,你再看看
回复 使用道具 举报
你这个哪里是多线程的代码啊。怎么没有看出来。实现多线程的两种方法:
创建线程的第一种方式:继承Thread类。
步骤:
定义类继承Thread。
复写Thread类中的run方法。:将自定义代码存储在run方法。让线程运行。
调用线程的start方法,该方法两个作用:启动线程,调用run方法。

创建线程的第二种方式:实现Runable接口
步骤:
1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法。将线程要运行的代码存放在该run方法中。
3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。为什么要将Runnable接口的子类对象传递给Thread的构造函数。因为,自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象
5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

你再仔细看看自己的代码,然后重新写,看看会不会对。{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
这不是多线程吧,建议再看看毕老师的视频。做好终结。
回复 使用道具 举报
线程池没有关闭,最后应该调用shutDown方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马