1. 程式人生 > >多執行緒(模擬買票)-----java基礎知識總結

多執行緒(模擬買票)-----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 }

複製程式碼

執行效果: