标签:
代码系本人逐字逐句编写所得,转载请注明出处,谢谢合作!
多线程售票的问题算是老生常谈了,笔者是Java初学者,曾为弄清楚这个问题在度娘里搜过好多篇关于这个问题的代码,发现正确的代码还是很有限.
粘贴复制的现象很严重,而且大多数代码问题主要是在打印车票超过数量的问题上(部分会打印出负数票号),还有个别会出现表面看似打印结果正确,但其实程序中还有线程在等待执行(在Eclipse的控制台看到明显的"红点"一直在亮着).以下是笔者自己写的关于这个问题的代码,由于个人水平有限,难免有所疏漏,希望大家莫吝赐教!
源代码:
1 import java.text.NumberFormat; 2 3 public class SellTickets { 4 public static void main(String[] args) { 5 6 //创建车票对象,并初始化车票总数 7 Ticket ticket=new Ticket(1000); 8 9 //创建售票线程 ,并设置窗口名字,然后启动线程,这里设置四个窗口 10 new Thread(ticket,"窗口A").start(); 11 new Thread(ticket,"窗口B").start(); 12 new Thread(ticket,"窗口C").start(); 13 new Thread(ticket,"窗口D").start(); 14 15 } 16 } 17 18 /** 19 * 采用实现Runnable接口的方式实现多线程 20 */ 21 class Ticket implements Runnable { 22 23 //总的车票数 24 int total; 25 26 Ticket(int total){ 27 this.total=total; 28 } 29 30 //初始车票号码 1 31 int num = 1; 32 33 @Override 34 public void run() { 35 while (true) { 36 37 synchronized ("") { 38 try { 39 // 任何线程获取"线程锁"以后都要先判断是否还有余票,防止等待的线程多打印车票 40 if (num > total) return; 41 42 // 获取当前线程名字 43 String threadName = Thread.currentThread().getName(); 44 45 // 格式化票号 46 String ticketNum = FormatTicketNum(num++); 47 48 // 打印火车票,休眠20毫秒模拟打印车票时间 49 Thread.sleep(20); 50 System.out.println(threadName + " 售出火车票No." + ticketNum); 51 52 // 某线程售完最后一张车票时,放出"车票已售罄"提示 53 if (num > total) { 54 System.out.println("车票已售罄!"); 55 return; 56 } 57 } catch (InterruptedException e) { 58 e.printStackTrace(); 59 } 60 } 61 } 62 } 63 64 /** 65 * 格式化车票号码 66 */ 67 static String FormatTicketNum(int num) { 68 69 NumberFormat nf = NumberFormat.getIntegerInstance(); 70 nf.setMinimumIntegerDigits(3); 71 return nf.format(num); 72 } 73 }
打印结果:
1 窗口D 售出火车票No.001 2 窗口D 售出火车票No.002 3 窗口D 售出火车票No.003 4 窗口D 售出火车票No.004 5 窗口D 售出火车票No.005 6 窗口D 售出火车票No.006 7 窗口D 售出火车票No.007 8 窗口D 售出火车票No.008 9 窗口D 售出火车票No.009 10 窗口D 售出火车票No.010 11 窗口D 售出火车票No.011 12 窗口D 售出火车票No.012 13 窗口D 售出火车票No.013 14 窗口D 售出火车票No.014 15 窗口D 售出火车票No.015 16 窗口D 售出火车票No.016 17 窗口D 售出火车票No.017 18 窗口D 售出火车票No.018 19 窗口D 售出火车票No.019 20 窗口D 售出火车票No.020 21 窗口D 售出火车票No.021 22 窗口D 售出火车票No.022 23 窗口D 售出火车票No.023 24 窗口D 售出火车票No.024 25 窗口D 售出火车票No.025 26 窗口D 售出火车票No.026 27 窗口D 售出火车票No.027 28 窗口D 售出火车票No.028 29 窗口D 售出火车票No.029 30 窗口D 售出火车票No.030 31 窗口D 售出火车票No.031 32 窗口D 售出火车票No.032 33 窗口D 售出火车票No.033 34 窗口D 售出火车票No.034 35 窗口C 售出火车票No.035 36 窗口C 售出火车票No.036 37 窗口C 售出火车票No.037 38 窗口C 售出火车票No.038 39 窗口C 售出火车票No.039 40 窗口C 售出火车票No.040 41 窗口A 售出火车票No.041 42 窗口A 售出火车票No.042 43 窗口A 售出火车票No.043 44 窗口A 售出火车票No.044 45 窗口A 售出火车票No.045 46 窗口A 售出火车票No.046 47 窗口A 售出火车票No.047 48 窗口B 售出火车票No.048 49 窗口B 售出火车票No.049 50 窗口B 售出火车票No.050 51 窗口B 售出火车票No.051 52 窗口B 售出火车票No.052 53 窗口B 售出火车票No.053 54 ... ... .... 55 窗口D 售出火车票No.974 56 窗口D 售出火车票No.975 57 窗口D 售出火车票No.976 58 窗口C 售出火车票No.977 59 窗口C 售出火车票No.978 60 窗口C 售出火车票No.979 61 窗口C 售出火车票No.980 62 窗口C 售出火车票No.981 63 窗口C 售出火车票No.982 64 窗口C 售出火车票No.983 65 窗口C 售出火车票No.984 66 窗口C 售出火车票No.985 67 窗口A 售出火车票No.986 68 窗口A 售出火车票No.987 69 窗口A 售出火车票No.988 70 窗口A 售出火车票No.989 71 窗口A 售出火车票No.990 72 窗口A 售出火车票No.991 73 窗口B 售出火车票No.992 74 窗口B 售出火车票No.993 75 窗口B 售出火车票No.994 76 窗口B 售出火车票No.995 77 窗口B 售出火车票No.996 78 窗口B 售出火车票No.997 79 窗口B 售出火车票No.998 80 窗口A 售出火车票No.999 81 窗口C 售出火车票No.1,000 82 车票已售罄!
标签:
原文地址:http://www.cnblogs.com/upyouth/p/5721820.html