多线程实现售票

  • 核心是共享资源的线程安全,因为如果不限制对共享数据的访问,就会导致出现卖同一张票,卖多票的情况。
  • 票数是共享资源,所以对票数进行访问和修改需要进行同步(排队)。
  • 在对票数进行修改的函数上使用synchronized关键字形成同步方法(默认是该类的对象锁)。
  • 这样每次代码运行到该处都会去锁池查看该对象锁是否空闲,空闲就获取锁并进入函数,如果已经有其他线程获取了该锁,就排队等待,等到获得锁的线程运行完毕释放锁才可以进行抢夺。(不过如果没有进行线程休眠,大概率会某一个线程刚释放锁,然后又抢到了锁。)

实现代码:

package thread;
public class ThreadTest implements Runnable {int i = 100;//共享资源public ThreadTest() {this.i=100;}public ThreadTest(int i) {//构造函数this.i = i;}public void run() {while (sale()) {//调用sale方法,同时sale返回值作为循环判断条件try {Thread.sleep(10);/** 这个睡眠是出现效果的关键,因为cpu的抢夺很快,* 所以每次线程释放锁的时候都让他休眠一下,* 这样其他线程就会立刻抢夺时间片,* 这样多窗口售票效果更明显,* 哪怕休眠一毫秒效果也很明显*/} catch (InterruptedException e) {e.printStackTrace();}}}public synchronized boolean sale() {//ThreadTest对象锁if (i > 0) {System.out.println(Thread.currentThread().getName() + "卖出了第" + i + "张票!");i--;return true;} else {return false;}}
}

测试类:

package thread;
public class ThreadMain {public static void main(String[] args) {ThreadTest w=new ThreadTest(10);Thread t1=new Thread(w);Thread t2=new Thread(w);Thread t3=new Thread(w);t1.setName("t1");t2.setName("t2");t3.setName("t3");t1.start();t2.start();t3.start();}
}

效果:

多线程实现多窗口售票相关推荐

  1. Day18:多线程-火车站多窗口售票案例

    一.进程与线程 进程的特征: 每一个进程的内部数据和状态都是完全独立的: 创建并执行一个进程的系统开销是比较大的: 进程是程序的一次执行过程,是系统运行程序的基本单位. 线程的特征: 在Java中,程 ...

  2. 多窗口售票:单件模式多线程实现

    多窗口售票:单件模式多线程实现 2017-06-01 场景如下:总共100张票,编号1~100,三个窗口售票,售完为止. Tickets.java 票为单件模式,代码如下: package Teste ...

  3. Java模拟售票窗口代码_java多线程模拟售票,多个窗口售票

    package com.ma.thread001; /** * 多线程模拟售票,多个窗口售票 * @author ma * */ public class SellTicktDemo implemen ...

  4. pyqt5多进程 python_PYQT5开启多个线程和窗口,多线程与多窗口的交互实例

    每点击一次按钮,弹出一个对话框(子窗口),同时开启一个子线程来执行任务并更新对话框内容,关闭对话框则关闭对应子线程 1. 建立一个简单的主界面和一个自定义对话框 from PyQt5 import Q ...

  5. 模拟火车站售票窗口,开启三个窗口售票,总票数为100张

    方法一:继承Thread class Window extends Thread{static int ticket = 100;public void run(){while (true) {if ...

  6. 【多线程与AfxGetMainWnd 窗口 与 线程 有必然联系吗? 命名空间】

    [多线程与AfxGetMainWnd & 窗口 与 线程 有必然联系吗? &  命名空间] 笔记内容: 转载自:http://blog.csdn.net/linyaoxin/artic ...

  7. java多线程同步 多窗口卖票实例_java多线程之火车售票系统模拟实例

    1.前言 为了学习多线程共享与通信,我们模拟一个火车售票系统,假设有10张火车票,三个窗口(也就是三个线程)同时进行售票. 2.非同步代码 package com.tl.skyLine.thread; ...

  8. Java多线程 模拟售票窗口售票

    编写一个Java 多线程程序,完成三个售票窗口同时出售20张票 程序分析: 1.票数要使用同一个静态值: 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: 创建一个站台类Stat ...

  9. 多线程的创建和使用,多线程案例:火车站售票

    多线程 1.并发与并行 *并行:指两个或多个事件在同一时刻发生(同时发生). *并发:指两个或多个事件在同一个时间段内发生. 2.线程和进程 *进程:是指一个内存中运行的应用程序,每个进程都有一个独立 ...

  10. 多线程:模仿火车站售票

    多线程:是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率.线程是在同一时间需要完成多项任务的时候实现的. 但是多线程有几个问题:要有被多个线程所共享的数据 多个线 ...

最新文章

  1. nacos集群之日志狂刷fail to connect server,after trying 567 times,last try server is...
  2. 圆柱体积怎么算立方公式_【六年级数学微课】巧算圆锥的体积
  3. boost::includes相关的测试程序
  4. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析
  5. 怎么批量选择目标_全日制专升本一次可以报几个学校?目标院校应该怎么选择?...
  6. 用Java写有关早上的语录,实用的适合早上发的早安问候语语录汇编39句
  7. 设计实现优雅修改redux数据流的一个库 - redux-chef
  8. 【Divided Two】cpp
  9. JAVA 相关书籍推荐(全)
  10. 啊哈C语言第五章 第 八 节
  11. stdafx.h到底有什么用
  12. Zmodem协议工作原理
  13. UML(统一建模语言)
  14. 基于Nonebot2搭建QQ机器人(二):插件使用
  15. 1.【Windows图标点击无反应修复
  16. Android高仿微信头像裁剪
  17. 数据库中索引的填充因子
  18. C语言-XLSX基础数据解析(需借助libxml2库)
  19. KVM虚拟化,超详细
  20. macOS配置vim

热门文章

  1. 彻底弄懂CSS盒子模式之四
  2. ftp 只需上传禁止下载
  3. windows下Spark环境搭建
  4. hotnets 2018 Gearing up for the 21st century space race 阅读报告
  5. SQL Server2019字段类型说明等
  6. 测量温度 [单调队列] 思维题
  7. 操作系统-动态分区-磁盘调度2021-01-09
  8. win10下asp站点的打开与错误解决策略
  9. 军工领域现元宇宙采购需求 “军工元宇宙概念”横空出世,真概念还是
  10. php把图片内容写入文件,PHP实现往图片上写入文字功能