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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程(模拟买票)-----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基础知识总结的主要内容,如果未能解决你的问题,请参考以下文章

简单的多线程买票模拟程序(lock解决多线程存在大安全隐患)

Java多线程同步锁的理解

狂神说Java笔记--多线程详解部分笔记

java2 多线程2 买票

java 22 - 11 多线程之模拟电影院售票口售票

Java 多线程—— 线程的同步