多线程(模拟买票)-----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 }

复制代码

运行效果:

 出现在的原因:

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

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 }

复制代码

 

同步代码块原理:

运行效果:

 

再次优化下代码:

复制代码

 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 }

复制代码

运行效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值