多线程(模拟买票)-----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.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
随机推荐
- 记录 第一次体验安装python第三方库的全过程
目的:安装 Pillow库 现状是:python是3.4,easy_install没有安装:pip没有安装, 步骤: 1.安装Pillow库需要安装pip 2.安装pip需要安装easy_instal ...
- 初次接触Dynamics 365
最近项目上需要用到微软的Dynamics 365 这个产品,Bing上搜索了一下,看了很多大佬在博客上分享了使用Dynamics 365的经验,简单了解了Dynamics 365 是什么,也有很多大企 ...
- Git 使用简记
目录 git 标签 添加标签 git tag <tagname> ,例:git tag v1.0 添加带有说明的标签 git tag -a v0.1 -m "第一次提交" ...
- Verilog HDL数组(存储器)操作
本文从本人的163博客搬迁至此. 引用了http://blog.sina.com.cn/s/blog_9424755f0101rhrh.html Verilog HDL中常采用数组方式来对存储器进行建 ...
- CentOS7使用winbind加入AD
https://ishm.idv.tw/?p=336 CentOS 7 使用 winbind 加入 AD 需求:已經熟悉 CentOS 6 的 AD 加入方式,CentOS 7 已將 winbind ...
- Cloud Native Weekly | Kubernetes 1.13发布
云原生一周精选 1——Kubernetes 1.13发布 2——Kubernetes首次出现重大安全漏洞 3——Docker和微软公司推出云原生应用的部署规范 4——谷歌推出beta版本的Cloud ...
- es6箭头函数使用场景导致的一些问题
1. 今天在使用draggable组件时,监听dragmove事件时获取到的事件对象有一些异常, 代码如下 draggable.on('drag:move', (event) => { cons ...
- Notes of Daily Scrum Meeting(12.8)
今日团队任务总结: 团队成员 今日团队工作 陈少杰 使用例子对json数据进行解析 王迪 确定搜索功能的接口 金鑫 对布局文件进行协助修改 雷元勇 开始进行搜索功能的代码实现 高孟烨 按照学长的样本对 ...
- M1阶段事后分析
M1阶段的开发结束了,在周四的课上我们组也进行了alpha阶段的汇报.我们的努力得到了应有的回报,下面我们将针对M1阶段产生的一些问题进行分析和反思. 一.设想和目标 1.我们的app更像是一款针对北 ...
- Beta阶段冲刺-6
一. 每日会议 1. 照片 2. 昨日完成工作 3. 今日完成工作 4. 工作中遇到的困难 杨晨露:各种问题,虽然都是开发上面的问题,但是都提出来就有点头大了. 戴志斌:对小程序公众号的开发不了解,因 ...