多线程(模拟买票)-----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 }
运行效果:
出现在的原因:
解决办法:修改这行代码就OK了
1 static int num=50;//票数
再次的运行效果:
再一次分析下,突然不想写了,哎,写完吧
解决办法:
算了,直接复制源码了
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 }
运行效果:
以上是关于多线程(模拟买票)-----java基础知识总结的主要内容,如果未能解决你的问题,请参考以下文章