多线程(模拟买票)-----java基础知识总结

这次的的问题引入的比较深入,如果看了这篇博客,不看下一篇,你会很懵逼。

代码:

 1 package com.day13.math;
 2 /** 
 3 * 类说明 :模拟三个窗口同时售票
 4 * @author 作者 : chenyanlong 
 5 * @version 创建时间:2017年10月29日 
 6 */
 7 public class ThreadTest1 {
 8 
 9     public static void main(String[] args) {
10         //创建三个线程对象
11         SaleTicket saleTicket1=new SaleTicket("窗口1");
12         SaleTicket saleTicket2=new SaleTicket("窗口2");
13         SaleTicket saleTicket3=new SaleTicket("窗口3");
14         
15         //开始售票
16         saleTicket1.start();
17         saleTicket2.start();
18         saleTicket3.start();
19     }
20 }
21 
22 //售票的窗口
23 class SaleTicket extends Thread{
24     
25     int num=50;//票数
26     
27     public SaleTicket(String name){
28         super(name);
29     }
30     
31 
32 
33     @Override
34     public void run(){
35         while(true){
36             if(num>0){
37                 System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
38                 num--;
39             }else{
40                 System.out.println("票买完了!");
41                 break;
42             }
43         }
44     }
45 }
View Code

运行效果:

 出现在的原因:

解决办法:修改这行代码就OK了

1 static int num=50;//票数
View Code

再次的运行效果:

再一次分析下,突然不想写了,哎,写完吧

解决办法:

 

 

 

 算了,直接复制源码了

 1 package com.day13.math;
 2 /** 
 3 * 类说明 :模拟三个窗口同时售票
 4 * @author 作者 : chenyanlong 
 5 * @version 创建时间:2017年10月29日 
 6 */
 7 public class ThreadTest1 {
 8 
 9     public static void main(String[] args) {
10         //创建三个线程对象
11         SaleTicket saleTicket1=new SaleTicket("窗口1");
12         SaleTicket saleTicket2=new SaleTicket("窗口2");
13         SaleTicket saleTicket3=new SaleTicket("窗口3");
14         
15         //开始售票
16         saleTicket1.start();
17         saleTicket2.start();
18         saleTicket3.start();
19     }
20 }
21 
22 //售票的窗口
23 class SaleTicket extends Thread{
24     
25     static int num=50;//票数
26     static Object o=new Object();
27     public SaleTicket(String name){
28         super(name);
29     }
30     
31 
32     @Override
33     public void run(){
34         while(true){
35             //同步代码块:
36             synchronized (o) {
37                 if(num>0){
38                     System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
39                     num--;
40                 }else{
41                     System.out.println("票买完了!");
42                     break;
43                 }
44             }
45         }
46     }
47 }
View Code

 

同步代码块原理:

运行效果:

 

再次优化下代码:

 1 package com.day13.math;
 2 /** 
 3 * 类说明 :模拟三个窗口同时售票
 4 * @author 作者 : chenyanlong 
 5 * @version 创建时间:2017年10月29日 
 6 */
 7 public class ThreadTest1 {
 8 
 9     public static void main(String[] args) {
10         //创建三个线程对象
11         SaleTicket saleTicket1=new SaleTicket("窗口1");
12         SaleTicket saleTicket2=new SaleTicket("窗口2");
13         SaleTicket saleTicket3=new SaleTicket("窗口3");
14         
15         //开始售票
16         saleTicket1.start();
17         saleTicket2.start();
18         saleTicket3.start();
19     }
20 }
21 
22 //售票的窗口
23 class SaleTicket extends Thread{
24     
25     static int num=50;//票数
26     static Object o=new Object();
27     public SaleTicket(String name){
28         super(name);
29     }
30     
31 
32     @Override
33     public void run(){
34         while(true){
35             //同步代码块:
36             synchronized (o) {
37                 if(num>0){
38                     System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
39                     num--;
40                     try {
41                         Thread.sleep(100);//每个线程执行一次,就睡眠100毫秒
42                     } catch (InterruptedException e) {
43                         // TODO Auto-generated catch block
44                         e.printStackTrace();
45                     }
46                 }else{
47                     System.out.println("票买完了!");
48                     break;
49                 }
50             }
51         }
52     }
53 }
View Code

运行效果:

 

posted @ 2017-10-29 16:20  glacial_water  阅读(382)  评论(0编辑  收藏  举报
Document