多线程实现火车站卖票
问题:
模拟火车站卖票:共有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();}}
}
五种实现的效果都差不多 。
多线程实现火车站卖票相关推荐
- 多线程模拟火车站卖票-继承Thread类
public class Demo2_Snschronized { public static void main(String[] args) { // TODO Auto-generated me ...
- 多线程经典问题 卖票问题
/** 需求:某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票 思路: ① 定义一个类Ticket实现Runnable接口,里面定义一个成员变量:pri ...
- 8.3 多线程练习,卖票
package com.atguigu.java;/*** 例子:创建三个窗口卖票,总票数为100张* @author Suki* @creat 2022-09-13 14:23*/class win ...
- java多线程并发卖票问题
最近学习遇到了经典的多线程并发的卖票问题,在网上搜了一些答案,还是决定自己写一写看,于是就出现了这篇文章,希望对初学者有些帮助!!! package practice.threadsafe; /* 多 ...
- 利用Thread 和 Runnable实现多线程,案例演示:《卖票》
1.实现一个卖票的功能,大家根据在汽车站或者火车站那个卖票的情况,假设有三个窗口,每个窗口就像一个线程,卖票的这几个窗口同时卖票, 就像实现多线程. 1 public class MyRun impl ...
- 多线程实现多个窗口卖票问题
写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...
- Java 多线程模拟卖票
完成操作系统作业Java模拟多线程卖票 /*** @Author: crush* @Date: 2021-05-12 16:24* version 1.0*/ public class SellTic ...
- Lock锁实现多线程卖票
理解多线程卖票demo Lock架构 使用lock替代synchronized 总结 使用Lock 实现. Lock架构 使用lock替代synchronized import java.util.c ...
- 卖票案例 多线程 java 1615387415
卖票案例 多线程 java 1615387415 解决 线程类 测试类 注意,需要给线程的类添加带参构造方法 在带参构造方法中 调一下父类的带参构造方法 最终结果 每个窗口都卖了一百张票
最新文章
- 99%的项目经理都不了解项目群管理!
- 痛入爽出 HTTP/2:代码实战1
- 万分之二用百分之怎么表示_万分之几用百分符号怎么表示 万分之五怎么写?0.5%...
- H5js的一些好玩的东西
- 端口报错listen eaddrinuse:::xxx
- 快评《19家网站内容低俗被曝光》
- [C++基金会]位计算 游戏开发中的应用
- 克隆虚拟机启动网卡提示错误 Device eth0 does not seem to be present, delaying initialization...
- java.util.Array中的方法
- 【文末有福利】如何理解我们所处世界的复杂性?
- 友华pt622g说明书_友华通信电信光猫 双口光纤猫PT622 这个可以设置无线吗
- FPS游戏:方框透视算法分析
- Android Fingerprint完全解析(二) :Fingerprint启动流程
- 搞定互联网安全的四大计划
- 解决Sheet can not be presented because the view is not in a window这样的问题
- 快速搭建 Node.js 开发环境以及加速 npm
- 编译程序和解释程序有什么区别?
- 项管行知03--项目类型
- 大连计算机学校附近的逸林,逸林街附近学校
- 银行业务模拟系统的设计与实现