编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。

package com.swift;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TicketSaleCenter {

    public static void main(String[] args) {
        /*
         * 第6题: 编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。   
         * * 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。
         */
        Ticket tic = new Ticket();
        tic.setTotal_num(1000);
        SaleWindow win = new SaleWindow(tic);
        Thread t1 = new Thread(win, "售票窗1");
        Thread t2 = new Thread(win, "售票窗2");
        Thread t3 = new Thread(win, "售票窗3");
        t1.start();
        t2.start();
        t3.start();
    }

}

class Ticket {

    private int total_num;
    private int sold_num;

    public int getTotal_num() {
        return total_num;
    }

    public void setTotal_num(int total_num) {
        this.total_num = total_num;
    }

    public int getSold_num() {
        return sold_num;
    }

    public void setSold_num(int sold_num) {
        this.sold_num = sold_num;
    }

}

class SaleWindow implements Runnable {

    private Ticket tic;

    public Ticket getTic() {
        return tic;
    }

    public void setTic(Ticket tic) {
        this.tic = tic;
    }

    public SaleWindow(Ticket tic) {
        super();
        this.tic = tic;
    }

    @Override
    public void run() {
        while (true) {
            synchronized ("锁") {
                int totalNum = tic.getTotal_num();
                int soldNum = tic.getSold_num();
                if (totalNum > 0) {
                    totalNum--;
                    tic.setTotal_num(totalNum);
                    soldNum++;
                    tic.setSold_num(soldNum);
                    System.out.println(Thread.currentThread().getName() + " 已卖出第 " + tic.getSold_num() + " 张票,"
                            + "剩余的票数是 " + tic.getTotal_num());
                }
            }
        }
    }

}

原文地址:https://www.cnblogs.com/qingyundian/p/8287594.html

时间: 2024-10-17 17:02:19

编写三各类Ticket、SaleWindow、TicketSaleCenter分别代表票信息、售票窗口、售票中心。 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。的相关文章

【Java】利用synchronized(this)完成线程的临界区

在<[Java]线程并发.互斥与同步>(点击打开链接)中利用了操作系统通过操作信号量控制的原始方法,完成了线程的互斥与同步,说句题外话,其实这个信号量的算法,是著名的迪杰斯特拉创造的,也就是数据结构.计算机网络上面最短路径算法.迪杰斯特拉算法.Dijkstra算法的贡献人.其实Java里面根本就不需要自己定义一个信号量来实现临界区,Java对于临界区的实现早已封装好了,而且synchronized还是Java的关键字. 那么,到底怎么来使用这个关键字呢?下面就对上次<[Java]线程并发

进程与线程浅析(三)之线程三国战斗模拟

好久没有更新这个系列的文章了,那么书接前文.上一篇文章中已经说了小匹夫是做游戏开发的,光说不练假把式,下面的文章就利用java中的线程来做一个小小的模拟对战的演示好了. 既然是做游戏开发,游戏背景还是要有的,那么就选择三国题材吧. 既然是三国,那么就是乱世争天下咯,军队就是必不可少的. 小匹夫本人喜欢刘备,那么敌人自然就假设是曹操了. 这里我们使用Runnabel对象启动军队线程来模拟军队的战斗行为. //用来创建军队线程,模拟军队战斗 public class ArmyRunnable imp

[转]C# 线程知识--使用Task执行异步操作

C# 线程知识--使用Task执行异步操作 ??????在C#4.0之前需要执行一个复杂的异步操作时,只能使用CLR线程池技术来执行一个任务.线程池执行异步任务时,不知道任务何时完成,以及任务的在任务完成后不能获取到返回值.但是在C#4.0中引人了一个的任务(System.Threading.Tasks命名空间的类型)机制来解决异步操作完成时间和完成后返回值的问题. 1.使用Task类创建并执行简单任务 ??? 通过使用Task的构造函数来创建任务,并调用Start方法来启动任务并执行异步操作.

一起talk C栗子吧(第一百二十一回:C语言实例--线程知识体系图)

各位看官们,大家好,上一回中咱们说的线程属性的例子,这一回咱们说的例子是:线程知识体系图.闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前面的章回中介绍了与线程相关的知识,在今天的章回中,我们将对这些知识进行总结,并且整理成一张知识体系图,方便大家掌握线程相关的知识. 下面是我们整理的知识体系图,请大家参数: 上图内容中的知识点都有相应的章回对应,下面是我整理的章回对应关系.为了大家方便,我设置了链接,大家可以直接点击链接跳到相应的章回中. 线程概念 线程概念:第一百零七回 线程标识

Java线程知识拾遗

知识回顾 进程与线程是常常被提到的两个概念.进程拥有独立的代码段.数据空间,线程共享代码段和数据空间,但有独立的栈空间.线程是操作系统调度的最小单位,通常一个进程会包含一个或多个线程.多线程和多进程都可以实现并发处理,如 nginx 使用多进程方式.tomcat 使用多线程方式.Apache 支持混合使用.在 C/C++ 等语言中可以同时使用多进程和多线程,而在 Java 中只能使用多线程. 在 Java 中,创建线程的唯一方式是创建 Thread 类的实例,调用实例的 start() 方法启动

C# 线程知识--使用ThreadPool执行异步操作

C# 线程知识--使用ThreadPool执行异步操作 在应用程序中有许多复杂的任务,对于这些任务可能需要使用一个或多个工作线程或I/O线程来协作处理,比如:定时任务.数据库数据操作.web服务.文件的处理等.这些任务可能会非常耗费时间,为了是用户界面能及时响应,就会启用一个其他线程来并行处理任务.线程的创建和销毁操作是非常昂贵的,过多的线程会带来内存资源的消耗以及操作系统调度可执行线程并执行上下文切换导致的时间消耗,所以过多线程会损坏应用程序的性能.如果创建过的线程能反复使用就能解决上面的一些

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

【DSP开发】利用CCS5.4开发基于DSP6455的JPEG2000图像解压缩过程

[DSP开发]利用CCS5.4开发基于DSP6455的JPEG2000图像解压缩过程 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:前端是时间基于VS2010工程,在windows上实现了对openjpeg2000的改写,实现了从内存中读取数据进行解压缩的工作.由于某些技术储备需要,将其移植到DSP6455中进行解压缩.本文记录的就是整个移植过程. 0. 异想天开:试图在CCS上直接使用VS2010生成好的编译库 这个想法是一直就有的,在调试VS

python全栈开发基础【第二十四篇】(利用threading模块开线程、join与守护线程、GIL与Lock)

一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 创建线程的开销比创建进程的开销小,因而创建线程的速度快. #开启进程的第一种方式 from multiprocessing import Process from threading import Thread import os import time def work(): print('<%s> is running'%os.g