问题:

模拟火车站卖票:共有100张票,实现10个站台同时售票,不能出现多卖。

以下分别用 Thread 、 Runnable 、线程池 、Callable 实现 ;分别以 synchronized 和 ReentrantLock 进行加锁。

图方便,所有线程都以匿名内部类创建,若觉得结构不清晰可以自己创建Thread/Runnable/Callable 类再创建线程。

1.synchronized锁、匿名内部类thread实现

/** 多线程售票* synchronized锁、匿名内部类thread实现*/
public class SellTickets {static int ticket = 100;static int count;public static void main(String[] args) {for(int i=0;i<10;i++) {new Thread() {public void run() {synchronized (SellTickets.class) {while(ticket > 0 ) {SellTickets.class.notifyAll();count++;System.out.println("站台["+Thread.currentThread().getId()+"]出售了第"+ticket+"张票,总共出售的票数:"+count);ticket--;try {SellTickets.class.wait(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}};}.start();}}
}

2.ReentrantLock锁、匿名内部类thread实现

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;/** 多线程售票* ReentrantLock锁、匿名内部类thread实现*/
public class SellTickets2 {static int ticket = 100;static int count;public static void main(String[] args) {ReentrantLock lock = new ReentrantLock();Condition condition = lock.newCondition();for(int i=0;i<10;i++) {new Thread() {public void run() {lock.lock();try {condition.signalAll();while(ticket > 0 ) {count++;System.out.println("站台["+Thread.currentThread().getId()+"]出售了第"+ticket+"张票,总共出售的票数:"+count);ticket--;condition.awaitNanos(1000);}} catch (Exception e) {// TODO: handle exception}finally {lock.unlock();}};}.start();}}
}

3.synchronized锁、线程池实现

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/** 多线程售票* synchronized锁、线程池实现*/
public class SellTickets3 {static int ticket = 100;static int count;public static void main(String[] args) {
//      BlockingQueue<Runnable> queue = new  ArrayBlockingQueue(10);
//      TimeUnit unit = null;
//      ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 10, 0, unit, queue);ExecutorService threadPool = Executors.newFixedThreadPool(10); //10条线程的固定线程池//Executors框架创建的线程池内部以ThreadPoolExecutor的方式创建(即上面注释方式)for(int i =0;i<10;i++) {threadPool.execute(new Runnable() {@Overridepublic void run() {synchronized (SellTickets.class) {while(ticket > 0 ) {SellTickets.class.notifyAll();count++;System.out.println("站台["+Thread.currentThread().getId()+"]出售了第 "+ticket+" 张票,总共出售的票数:"+count);ticket--;try {SellTickets.class.wait(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}});}threadPool.shutdown();}
}

4.synchronized锁、Runnable实现

/** 多线程售票* synchronized锁、Runnable实现*/
public class SellTickets4 {static int ticket = 100;static int count;public static void main(String[] args) {for(int i=0;i<10;i++) {new Thread(new Runnable() {@Overridepublic void run() {synchronized (SellTickets.class) {while(ticket > 0 ) {SellTickets.class.notifyAll();count++;System.out.println("站台["+Thread.currentThread().getId()+"]出售了第"+ticket+"张票,总共出售的票数:"+count);ticket--;try {SellTickets.class.wait(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}};}) {}.start();}}
}

5、synchronized锁、Callable实现

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;/** 多线程售票* synchronized锁、Callable实现*/
public class SellTickers5 {static int ticket = 100;static int count;public static void main(String[] args) {for(int i=0;i<10;i++) {new Thread(new FutureTask<Integer>(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {synchronized (SellTickets.class) {while(ticket > 0 ) {SellTickets.class.notifyAll();count++;System.out.println("站台["+Thread.currentThread().getId()+"]出售了第"+ticket+"张票,总共出售的票数:"+count);ticket--;try {SellTickets.class.wait(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return count;}}) {}) {}.start();}}
}

五种实现的效果都差不多 。

多线程实现火车站卖票相关推荐

  1. 多线程模拟火车站卖票-继承Thread类

    public class Demo2_Snschronized { public static void main(String[] args) { // TODO Auto-generated me ...

  2. 多线程经典问题 卖票问题

    /** 需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票 思路: ① 定义一个类Ticket实现Runnable接口,里面定义一个成员变量:pri ...

  3. 8.3 多线程练习,卖票

    package com.atguigu.java;/*** 例子:创建三个窗口卖票,总票数为100张* @author Suki* @creat 2022-09-13 14:23*/class win ...

  4. java多线程并发卖票问题

    最近学习遇到了经典的多线程并发的卖票问题,在网上搜了一些答案,还是决定自己写一写看,于是就出现了这篇文章,希望对初学者有些帮助!!! package practice.threadsafe; /* 多 ...

  5. 利用Thread 和 Runnable实现多线程,案例演示:《卖票》

    1.实现一个卖票的功能,大家根据在汽车站或者火车站那个卖票的情况,假设有三个窗口,每个窗口就像一个线程,卖票的这几个窗口同时卖票, 就像实现多线程. 1 public class MyRun impl ...

  6. 多线程实现多个窗口卖票问题

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  7. Java 多线程模拟卖票

    完成操作系统作业Java模拟多线程卖票 /*** @Author: crush* @Date: 2021-05-12 16:24* version 1.0*/ public class SellTic ...

  8. Lock锁实现多线程卖票

    理解多线程卖票demo Lock架构 使用lock替代synchronized 总结 使用Lock 实现. Lock架构 使用lock替代synchronized import java.util.c ...

  9. 卖票案例 多线程 java 1615387415

    卖票案例 多线程 java 1615387415 解决 线程类 测试类 注意,需要给线程的类添加带参构造方法 在带参构造方法中 调一下父类的带参构造方法 最终结果 每个窗口都卖了一百张票

最新文章

  1. 99%的项目经理都不了解项目群管理!
  2. 痛入爽出 HTTP/2:代码实战1
  3. 万分之二用百分之怎么表示_万分之几用百分符号怎么表示 万分之五怎么写?0.5%...
  4. H5js的一些好玩的东西
  5. 端口报错listen eaddrinuse:::xxx
  6. 快评《19家网站内容低俗被曝光》
  7. [C++基金会]位计算 游戏开发中的应用
  8. 克隆虚拟机启动网卡提示错误 Device eth0 does not seem to be present, delaying initialization...
  9. java.util.Array中的方法
  10. 【文末有福利】如何理解我们所处世界的复杂性?
  11. 友华pt622g说明书_友华通信电信光猫 双口光纤猫PT622 这个可以设置无线吗
  12. FPS游戏:方框透视算法分析
  13. Android Fingerprint完全解析(二) :Fingerprint启动流程
  14. 搞定互联网安全的四大计划
  15. 解决Sheet can not be presented because the view is not in a window这样的问题
  16. 快速搭建 Node.js 开发环境以及加速 npm
  17. 编译程序和解释程序有什么区别?
  18. 项管行知03--项目类型
  19. 大连计算机学校附近的逸林,逸林街附近学校
  20. 银行业务模拟系统的设计与实现

热门文章

  1. Flask Web开发 3.0 模板
  2. R语言升级版本和迁移老版本中的包到新版本上的一些问题
  3. Google Maps嵌入参数
  4. JDK8 after时间日期api
  5. 安装及设置MASM32 SDK
  6. Compose 横竖屏切换时状态如何保存?rememberSaveable 实现原理分析
  7. Idea import导包去掉*
  8. httpcancry抓包教程_httpcanary一抓包就断网
  9. 《Java 2 实用教程》读书笔记(四)4.4
  10. 少女枪战怎么用电脑玩 少女枪战模拟器玩法教程