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

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

时间:2017-10-29 17:35:36      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:博客   ges   pack   --   catch   stat   get   inter   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

运行效果:

技术分享

 

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

标签:博客   ges   pack   --   catch   stat   get   inter   java基础知识   

原文地址:http://www.cnblogs.com/chenyanlong/p/7750318.html

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