码迷,mamicode.com
首页 > 编程语言 > 详细

老生常谈之多线程卖票问题

时间:2016-07-30 22:20:05      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

代码系本人逐字逐句编写所得,转载请注明出处,谢谢合作!

   多线程售票的问题算是老生常谈了,笔者是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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!