多线程(模拟买票)-----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.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
随机推荐
- libgdx学习记录10——Particle粒子
粒子对制作画面特效很有用,可以使用Particle Editor进行自行编辑粒子效果,跟图片一起生成.p粒子文件,然后导入到程序中使用. 本文所用的粒子效果是基于其自带的demo的. 实例: pack ...
- python 获取文件和文件夹大小
1.os.path.getsize可以获取文件大小 >>> import os >>> file_name = 'E:\chengd\Cd.db' >> ...
- Neo4j 第四篇:使用C#更新和查询Neo4j
本文使用的IDE是Visual Studio 2015 ,驱动程序是Neo4j官方的最新版本:Neo4j Driver 1.3.0 ,创建的类库工程(Project)要求安装 .NET Framewo ...
- 未能使用“Csc”任务的输入参数初始化该任务
今天.NetCore2.1版本,建立Asp.net Core web应用程序项目时,报以下错误: 未能使用“Csc”任务的输入参数初始化该任务. “Csc”任务不支持“SharedCompilatio ...
- TICTOC: Header Only C++ Timer
感觉最近的更新频率略高啊-哈哈- 这次的带来的是一个十分简单便利的C++计时库. 项目地址:https://github.com/miaoerduo/tictoc 欢迎Start和提MR. 项目中有详 ...
- 2、Docker镜像和镜像管理
一.镜像介绍 1.定义 一个只读层被称为镜像,一个镜像是永久不会变的. 由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的. 但是所有的变更都发生顶层的可写 ...
- mvc5.0-路由
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
- shellcode 初次使用笔记
winXP SP3 环境 (xp环境默认没开启栈不可执行机制,比较方便破解,如果已开启了,请自行百度如何关闭) dig.exe 目标文件 x86dbg调试工具 python 环境 打开准备好的目标软件 ...
- 用Micro:bit做交通信号灯
交通信号灯项目在控制技术中,有点像"Hello world!" 是一个入门级的范例. 对于孩子来说,交通灯跟日常生活息息相关,他们都熟悉,充分知道需要做什么这是一个让孩子开始的好项 ...
- [T-ARA][Ma boo]
歌词来源:http://music.163.com/#/song?id=22704447 作曲 : 金道勋/Rhymer [作曲 : 金道勋/Rhymer] 作词 : 金道勋 [作词 : 金道勋] 사 ...