这次的的问题引入的比较深入,如果看了这篇博客,不看下一篇,你会很懵逼。

代码:

 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基础知识总结的更多相关文章

  1. java基础知识 多线程

    package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...

  2. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  3. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  4. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  5. java基础知识一览(二)

    一.java基础知识 1.一个文件中只能有一个public的类,因为他的类名要求和文件名相同. 2.classpath变量可以设置其它目录下的类. 例如:类文件所在目录是:F:\Javajdk,那么没 ...

  6. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

  7. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  8. Java 基础知识总结

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.数据类型:  数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte  8位   (by ...

  9. 学习Spring必学的Java基础知识(2)----动态代理

    Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...

  10. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

随机推荐

  1. Linux环境中Qt程序的手工发布

    Linux环境中Qt程序的手工发布

  2. opencv配置(转)

    1. 下载安装Opencv,去官网http://opencv.org/即可下载最新版本的Opencv,此处用的是Opencv 2.4.10 安装时傻瓜式的,最新版本的安装就是相当于解压到你指定的安装目 ...

  3. 【python笔记】使用matplotlib,pylab进行python绘图

    一提到python绘图,matplotlib是不得不提的python最著名的绘图库,它里面包含了类似matlab的一整套绘图的API.因此,作为想要学习python绘图的童鞋们就得在自己的python ...

  4. [CF1039D]You Are Given a Tree[贪心+根号分治]

    题意 给你\(n\)个点的树,其中一个简单路径的集合被称为\(k\)合法当且仅当树的每个节点最多属于一条路径,且每条路径包含\(k\)个节点.对于每个\(k(k \in [1,n])\),输出最多的\ ...

  5. flask_admin 笔记五 内置模板设置

    内建模板 Flask-Admin是使用jinja2模板引擎 1)扩展内建的模板 不要完全覆盖内置的模板,最好是扩展它们. 这将使您更容易升级到新的Flask-Admin版本. 在内部,Flask-Ad ...

  6. java批量爬取电影资源

    摘要 网上有很多个人站来分享电影资源,其实有时候我们自己也想做这个一个电影站来分享资源.但是这个时候就有一个问题,电影的资源应该从哪里来呢?难道要自己一条条手动去从网络上获取,这样无疑是缓慢而又效率低 ...

  7. GitHub 新手教程 六,Git GUI 新手教程(3),从GitHub远端同步代码库

    从GitHub把代码库下载到本地: 1,打开 GitGUI,单击我们之前克隆好的本地库: 2,按图片所示点击,同步远端代码: 3,出现如下提示后,点击“Close”: 4,上面只是把代码下载下来,还没 ...

  8. [SHELL]输入输出重定向与管道

    一 . 输出重定向(将命令的输出重定向到文件): ls -al > test 以覆盖的方式写入 ls -al >> test 以追加的方式写入 二 . 输入重定向(将文件的内容重定向 ...

  9. python爬虫-使用cookie登录

    前言: 什么是cookie? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想 ...

  10. UI Recorder 安装教程(一)

    前言: UI Recorder 是一款零成本UI自动化录制工具,类似于Selenium IDE. UI Recorder 要比Selenium IDE更加强大! UI Recorder 非常简单易用. ...