多執行緒(模擬買票)-----java基礎知識總結
阿新 • • 發佈:2018-12-03
這次的的問題引入的比較深入,如果看了這篇部落格,不看下一篇,你會很懵逼。
程式碼:
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 }