多线程(模拟买票)-----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.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
随机推荐
- mfc CSpinButton
知识点: CSliderCtrl(滑块)控件 CSliderCtrl常用属性 CSliderCtrl类常用成员函数 CSliderCtrl运用示例 一.CSliderCtr常用属性 Orientati ...
- python 相对路径导入 与 绝对路径导入
我的理解: 假设有一个文件夹 app 若 app 下有app/__init__.py文件,则此 app 被视作一个 package,而 app 下的其他文件/文件夹被视作 module 我们知道,pa ...
- Kubernetes学习之路(二十一)之网络模型和网络策略
目录 Kubernetes的网络模型和网络策略 1.Kubernetes网络模型和CNI插件 1.1.Docker网络模型 1.2.Kubernetes网络模型 1.3.Flannel网络插件 1.4 ...
- python常用算法实现
排序是计算机语言需要实现的基本算法之一,有序的数据结构会带来效率上的极大提升. 1.插入排序 插入排序默认当前被插入的序列是有序的,新元素插入到应该插入的位置,使得新序列仍然有序. def inser ...
- Android 实现 WheelView
wheel view 目录(?)[-] Android WheelView效果图 网上的开源代码 实现思路 扩展Gallery 如何使用 我们都知道,在iOS里面有一种控件------滚筒控件(Whe ...
- Python魔术世界 1 如何使用Visual Studio在WIN10中一键安装Python3入门编程环境并测试Django
本文通过VS安装Python和Django的环境,创建了一个Web程序,前后5分钟的操作,让你快速入门Python的编程世界,各种Python和Django的概念会在实战中给你娓娓道来. Django ...
- 4、c++ Arx二次开发创建多段线
一.本节课程 c++ Arx二次开发创建多段线 二.本节要讲解的知识点 如何应用C++ ARX二次开发创建多段线(AcDbPolyline.AcDb2dPolyLine.AcDb3dPolyline的 ...
- 教你用PS制作雨天窗户上透明水滴字
雨天窗户上透明水滴字制作方法很简单,主要利用图层样式来实现.学习后可以让你对图层样式有更好的了解,认识. 先看下完成后的效果图: 步骤1: 在Photoshop中我们新建或Ctrl+N,创建1920x ...
- Kubernetes采用CoreDNS
参考文档: kubernetes插件:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns 自 ...
- 每天学一点---document.createDocumentFragment
document.createDocumentFragment 用于创建文档对象,创建好的对象存在于内存中(不会引起回流,对元素位置和几何上的运算),不是附着在DOM树上,所以有更好的性能 可将该文 ...