多线程(模拟买票)-----java基础知识总结
这次的的问题引入的比较深入,如果看了这篇博客,不看下一篇,你会很懵逼。
代码:
package com.day13.math;
/**
* 类说明 :模拟三个窗口同时售票
* @author 作者 : chenyanlong
* @version 创建时间:2017年10月29日
*/
public class ThreadTest1 { public static void main(String[] args) {
//创建三个线程对象
SaleTicket saleTicket1=new SaleTicket("窗口1");
SaleTicket saleTicket2=new SaleTicket("窗口2");
SaleTicket saleTicket3=new SaleTicket("窗口3"); //开始售票
saleTicket1.start();
saleTicket2.start();
saleTicket3.start();
}
} //售票的窗口
class SaleTicket extends Thread{ int num=50;//票数 public SaleTicket(String name){
super(name);
} @Override
public void run(){
while(true){
if(num>0){
System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
num--;
}else{
System.out.println("票买完了!");
break;
}
}
}
}
运行效果:

出现在的原因:


解决办法:修改这行代码就OK了
static int num=50;//票数
再次的运行效果:

再一次分析下,突然不想写了,哎,写完吧

解决办法:



算了,直接复制源码了
package com.day13.math;
/**
* 类说明 :模拟三个窗口同时售票
* @author 作者 : chenyanlong
* @version 创建时间:2017年10月29日
*/
public class ThreadTest1 { public static void main(String[] args) {
//创建三个线程对象
SaleTicket saleTicket1=new SaleTicket("窗口1");
SaleTicket saleTicket2=new SaleTicket("窗口2");
SaleTicket saleTicket3=new SaleTicket("窗口3"); //开始售票
saleTicket1.start();
saleTicket2.start();
saleTicket3.start();
}
} //售票的窗口
class SaleTicket extends Thread{ static int num=50;//票数
static Object o=new Object();
public SaleTicket(String name){
super(name);
} @Override
public void run(){
while(true){
//同步代码块:
synchronized (o) {
if(num>0){
System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
num--;
}else{
System.out.println("票买完了!");
break;
}
}
}
}
}
同步代码块原理:

运行效果:

再次优化下代码:
package com.day13.math;
/**
* 类说明 :模拟三个窗口同时售票
* @author 作者 : chenyanlong
* @version 创建时间:2017年10月29日
*/
public class ThreadTest1 { public static void main(String[] args) {
//创建三个线程对象
SaleTicket saleTicket1=new SaleTicket("窗口1");
SaleTicket saleTicket2=new SaleTicket("窗口2");
SaleTicket saleTicket3=new SaleTicket("窗口3"); //开始售票
saleTicket1.start();
saleTicket2.start();
saleTicket3.start();
}
} //售票的窗口
class SaleTicket extends Thread{ static int num=50;//票数
static Object o=new Object();
public SaleTicket(String name){
super(name);
} @Override
public void run(){
while(true){
//同步代码块:
synchronized (o) {
if(num>0){
System.out.println(Thread.currentThread().getName()+"出售了第"+num+"票");
num--;
try {
Thread.sleep(100);//每个线程执行一次,就睡眠100毫秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
System.out.println("票买完了!");
break;
}
}
}
}
}
运行效果:

多线程(模拟买票)-----java基础知识总结的更多相关文章
- java基础知识 多线程
package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- java基础知识一览(二)
一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...
- 黑马毕向东Java基础知识总结
Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记 侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...
- java基础知识小总结【转】
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- Java 基础知识总结
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.数据类型: 数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte 8位 (by ...
- 学习Spring必学的Java基础知识(2)----动态代理
Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
随机推荐
- Canvas事件绑定
canvas事件绑定 众所周知canvas是位图,在位图里我们可以在里面画各种东西,可以是图片,可以是线条等等.那我们想给canvas里的某一张图片添加一个点击事件该怎么做到.而js只能监听到canv ...
- libgdx判断矩形重叠碰撞
有两种方式. 1. 排除法,排除四种不可能重叠的情况就是了. public static boolean IsOverlap( Rectangle rect1, Rectangle rect2 ){ ...
- stl源码剖析 详细学习笔记 hashset hashmap
//---------------------------15/03/26---------------------------- //hash_set { /* hash_set概述: 1:这是一个 ...
- log4j配置简要说明
################################################################################ #①配置根Logger,其语法为: # ...
- 开源微信Http协议Sdk【实现登录/获取好友列表/修改备注/发送消息】
基于微信Http协议封装的一个Sdk,目前实现了以下功能:. 1:扫码登录(检测二维码扫描状态) 2:获取最近联系人.群组.所有联系人 3:修改好友备注 4:给好友发送消息 暂且这么多,也没多余的时间 ...
- A星寻路算法入门(Unity实现)
最近简单学习了一下A星寻路算法,来记录一下.还是个萌新,如果写的不好,请谅解.Unity版本:2018.3.2f1 A星寻路算法是什么 游戏开发中往往有这样的需求,让玩家控制的角色自动寻路到目标地点, ...
- deepin 下mysql编码问题utf8的解决
deepin 下mysql编码问题utf8的解决 参考链接 http://www.ha97.com/5359.html 与之不同的地方在第二歩 二.最简单的完美修改方法,修改mysql的my.cnf文 ...
- JavaBeans与内省(Introspector)
JavaBean与Introspector 反射和内省操作很多时候都是在以后要做框架的时候作用非常大. 现在你学的是面向对象编程,即:你所写代码都能够找到对应的类或接口,找到具体的方法写出对应的 ...
- ElasticSearch 2 (30) - 信息聚合系列之条形图
ElasticSearch 2 (30) - 信息聚合系列之条形图 摘要 版本 elasticsearch版本: elasticsearch-2.x 内容 聚合还有一个令人激动的特性就是能够十分容易地 ...
- week5-Internetwork Layer
Technology:Internets and Packets course Layer 2 : Internet Protocol The InterNetwork Internetwork La ...