Java模拟多线程实现抢票代码实例
这篇文章主要介绍了Java模拟多线程实现抢票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
实现100张票抢购的demo
这里需要一个变量,来保存100张
局部变量:
- 定义在方法内,方法运行存在,方法运行结束销毁,无法保存一个持久化数据!!!
成员变量:
- 保存在类对象内,创建对象之后存在,对象不销毁成员变量也不会被内存收回。因为
- 在每一个类对象中,都存在一个对应的成员变量,这些成员变量不是同一个数据。不是
- 共享资源,不合适!!!
静态成员变量:
- 保存在内存的【数据区】,类文件加载时就存在,并且可以给每一个类对象使用,一处修改
- 处处受影响!!!作为共享资源非常合适!!!
问题
1. 销售顺序存在异常
2. 存在某一张票被销售了多次
使用锁
代码如下
class SaleThread implements Runnable { /** * 使用静态成员变量作为100张票的保存变量,是一个共享资源。 */ private static int tickets = 100; @Override public void run() { // 完成售票过程 while (true) { /* 字符串可以作为锁对象,因为双引号包含的字符串不管在代码中如何运行,有且只有一个 */ synchronized ("锁") { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } if (tickets > 0) { System.out.println(Thread.currentThread().getName() + "售出了" + tickets + "张票"); tickets--; } else { System.out.println(Thread.currentThread().getName() + "售罄!!!"); break; } } } } } public class Demo { public static void main(String[] args) { Thread t1 = new Thread(new SaleThread(), "售票人员1"); Thread t2 = new Thread(new SaleThread(), "售票人员2"); Thread t3 = new Thread(new SaleThread(), "售票人员3"); t1.start(); t2.start(); t3.start(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
Java多线程之火车售票系统
Java多线程之火车售票(Thread和Runnable的区别) java中实现多线程的方式有两种 继承Thread类 实现Runnable接口 继承了Thread类的类,使用对象.start()启动线程 实现了Runnable类的类,使用new Thread(new Runnable的实现类()).start()启动 下面有个经典例子,很适合用实现Runnable接口的类去实现. 火车售票问题简单分析: 1.票数是共用的,不能将一张票买多次. 2.同时有多个售票点在出售车票,即有多个线程存在
-
Java多线程模拟电影售票过程
用多线程模拟电影售票过程(Java实训) 实训目的: 多线程的实现.线程同步 实训要求: 总票数和售票窗口数由键盘输入,用每个线程处理一个窗口的售票. Test.java package program5; import java.util.Scanner; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(S
-
java多线程之火车售票系统模拟实例
1.前言 为了学习多线程共享与通信,我们模拟一个火车售票系统,假设有10张火车票,三个窗口(也就是三个线程)同时进行售票. 2.非同步代码 package com.tl.skyLine.thread; /** * Created by tl on 17/3/6. */ public class SellTicket { public static void main(String[] args) { TicketWindow tw = new TicketWindow(); Thread t1
-
Java多线程模拟售票程序和线程安全问题
Java中线程部分知识中,售票程序非常经典.程序中也有一些问题存在! 需求:模拟3个窗口同时在售100张票. 问题1:为什么100张票被卖出了300张票? 原因:因为tickets是非静态的,非静态的成员变量数据是在每个对象中都会维护一份数据的,三个线程对象就会有三份. 解决方案:把tickets票数共享出来给三个线程对象使用.使用static修饰. 问题2: 出现了线程安全问题 ? 线程安全问题的解决方案:sun提供了线程同步机制让我们解决这类问题的. java线程同步机制的方式: 方式一:同
-
Java多线程窗口售票问题实例
本文介绍了多线程实现多个窗口售票问题的两种枷锁方式, 分别是synchronized 和lock()和unlock() 具体代码如下: 第一种: package Runnable; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /* * 同步 * 这里有两种方式加锁 * 分别是 * 1.synchronized * 2.lock()和unlock() */ publ
-
Java通过卖票理解多线程
以卖票的例子来介绍多线程和资源共享,下面我们来看看为什么要用卖票作为例子. 卖票是包含一系列动作的过程,有各种操作,例如查询票.收钱.数钱.出票等,其中有一个操作是每次卖掉一张,就将总的票数减去1.有10张票,如果一个人卖票,先做查票.收钱.数钱等各种操作,再将总的票数减去1,效率很低.如果多个人卖票,每个人都是做同样的操作,数钱.检查钱,最后将总的票数减1,这样效率高.但是有一个问题,如果出现两个人同时将总的票数减掉了1,例如,A.B两个人同时读取到票的总数是10,A从中减去1,同时B也从中减
-
java实现多线程卖票功能
java多线程卖票直接先看个例子: public class SelTicketsMainTest { public static void main(String[] args) { SaleTickets1 saleTickets = new SaleTickets1(); for(int t=1;t<=3;t++) { new Thread(saleTickets).start(); } } } class SaleTickets1 implements Runnable{ private
-
java多线程之铁路售票系统
本文实例为大家分享了java多线程之铁路售票系统的具体代码,供大家参考,具体内容如下 问题:铁路售票,一共100张,通过四个窗口卖完. 要求:分别用 继承Thread类 和 实现Runnable接口 去实现 ①用继承Thread类去实现 package com.yy.syn; public class Demo3_Ticket { /** * 铁路售票,一共100张,通过四个窗口卖完 * 用继承Thread类去实现 * 分析: * 四个窗口就相当于四条线程,100张火车票就相当于成员变量 * *
-
Java模拟多线程实现抢票代码实例
这篇文章主要介绍了Java模拟多线程实现抢票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 实现100张票抢购的demo 这里需要一个变量,来保存100张 局部变量: 定义在方法内,方法运行存在,方法运行结束销毁,无法保存一个持久化数据!!! 成员变量: 保存在类对象内,创建对象之后存在,对象不销毁成员变量也不会被内存收回.因为 在每一个类对象中,都存在一个对应的成员变量,这些成员变量不是同一个数据.不是 共享资源,不合适!!! 静态成员变量:
-
java模拟多线程http请求代码分享
java模拟http发送请求,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 实例代码: package test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.Exec
-
python+selenium实现自动抢票功能实例代码
简介 什么是Selenium? Selenium是ThoughtWorks公司的一个强大的开源Web功能测试工具系列,采用Javascript来管理整个测试过程,包括读入测试套件.执行测试和记录测试结果.它采用Javascript单元测试工具JSUnit为核心,模拟真实用户操作,包括浏览页面.点击链接.输入文字.提交表单.触发鼠标事件等等,并且能够对页面结果进行种种验证.也就是说,只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件.(Selenium的
-
Java编程多线程之共享数据代码详解
本文主要总结线程共享数据的相关知识,主要包括两方面:一是某个线程内如何共享数据,保证各个线程的数据不交叉:一是多个线程间如何共享数据,保证数据的一致性. 线程范围内共享数据 自己实现的话,是定义一个Map,线程为键,数据为值,表中的每一项即是为每个线程准备的数据,这样在一个线程中数据是一致的. 例子 package com.iot.thread; import java.util.HashMap; import java.util.Map; import java.util.Random; /*
-
JAVA模拟多线程给多用户发送短信
这篇文章主要介绍了JAVA模拟多线程给多用户发送短信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码编写逻辑,假设需要给11个用户发送短信,每一个线程给两个用户发送短信,实现多线程的并发处理 创建实体user package www.it.com.test; /** * @author wangjie * @date 2019/11/20 17:10 * @description * @company 石文软件有限公司 */ public
-
java中stack(栈)的使用代码实例
java中stack类继承于vector,其特性为后进先出(lastinfirstout). 入栈和出栈实例图: 实例图的java代码实例: package com.lanhuigu.java.ListTest; import java.util.Stack; public class StackTest { public static void main(String[] args) { Stack<String> staffs = new Stack<String>(); //
-
Java中io流解析及代码实例
IO流 Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的:常用的文件读取用的就是字符流,在网络通信里面用的就是字节流 下面这张图是Java中IO流的总体框架: 字节流 Java中字节流一般都是以stream结尾的,输入的字节流叫InputStream,输出字节流叫OutputStream;InputStream和OutputStream是表示自己输入/输出的所有类的超类,是抽象类(abstract) 常用的字节流有: 1.FileInp
-
java获取当前时间并格式化代码实例
这篇文章主要介绍了java获取当前时间并格式化代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 private static final DateTimeFormatter FORMAT_FOURTEEN = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); private static final DateTimeFormatter FORMAT_DATE = DateTimeFor
-
java一个数据整理的方法代码实例
这篇文章主要介绍了java一个数据整理的方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import java.sql.*; public class Main { //本地数据库 // static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; // static final String DB_URL = "jdbc:mysql://127.0.0.1
-
java 对象参数去空格方式代码实例
这篇文章主要介绍了java 对象参数去空格方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test { /** * 去掉bean中所有属性为字符串的前后空格 * * @param bean * @throws Exception */ public static void bea
随机推荐
- 做一个简单的PHP测试页来测试是否正常
- Android HorizontalScrollView左右滑动效果
- 浅谈java基本数据类型的范围(分享)
- java Hibernate save()与persist()区别
- Java在Linux下 不能处理图形的解决办法 分享
- JAVA ArrayList详细介绍(示例)
- 复制粘贴功能的Python程序
- 浅谈C#中的常量、类型推断和作用域
- 深入浅析PHP7.0新特征(五大新特征)
- 在Python中使用mongoengine操作MongoDB教程
- JavaScript函数的一些注意要点小结及js匿名函数
- div中文字内容溢出常见的解决方法
- 批处理+Rar实现批量独立压缩目录和解压目录
- js跨域请求的5中解决方式
- Android Activity 横竖屏切换的生命周期
- 3DMark使用图文详解 --显卡测试软件
- Java并发问题之乐观锁与悲观锁
- Java实现购物管理系统
- 如何自定义微信小程序tabbar上边框的颜色
- Unity自定义编辑器界面(Inspector界面)