这里以车站售票作为模拟场景,多个票务人员同时出售某一列高铁(G250?)的车票,售票的基本保证有2点:

  1、不能售出多于预定限额的车票。

  2、不能售出具有相同座位的车票。

初学java,有不当的地方各位看官请指教~

代码如下:

package threadjava;

public class ThreadTest4 {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        //限定总票数为100张
        Seller seller = new Seller(100);
        //开放三个窗口售票
        Worker w1 = new Worker(seller);
        Worker w2 = new Worker(seller);
        Worker w3 = new Worker(seller);
    }

}

//打印车票的机器,作为服务端可连接多个客户端运行使用
class Seller {
    private int[] tickets;
    private int sold_line;

    public Seller(int ticket_total) {
        this.tickets = getTickets(ticket_total);
        this.sold_line = ticket_total;
    }

    //该方法是个独占性方法,即同一时刻只允许一个线程调用
    //也是java多线程进行同步操作的主要实现部分
    public synchronized int sell() {
        if(this.sold_line != 0){
            int ticket_pos = (int)(Math.random()*this.sold_line);
            int ticket = this.tickets[ticket_pos];
            this.sold_line = this.sold_line - 1;
            swap(this.tickets, ticket_pos, this.sold_line);
            return ticket;
        }else{
            return -1;
        }
    }

    private static void swap(int[] a, int x, int y){
        int temp = a[x];
        a[x] = a[y];
        a[y] = temp;
    }

    private static void shfulle(int[] a) {
        int x, y;
        for(x=0; x<a.length; x++){
            y = (int)(Math.random() * (x+1));
            swap(a, x, y);
        }
    }

    private static int[] getTickets(int total){
        int i;
        int[] a = new int[total];
        for(i=0; i<total; i++){
            a[i] = i;
        }
        shfulle(a);
        return a;
    }
}

//售票人员,被激活后就立即开始售票。哈哈,真是敬业~
class Worker extends Thread {
    private static int threadID = 0;
    private Seller tickor;

    public Worker(Seller seller) {
        super("Ticket Seller NO." + (++threadID));
        this.tickor = seller;
        this.start();
    }

    public void run() {
        while(true){
            int ticket = this.tickor.sell();
            if(ticket == -1){
                System.out.println(this.getName() + ", sold out.");
                break;
            }else{
                System.out.println(this.getName() + ", get ticket:" + ticket);
            }
        }
    }
}

出票结果:

Ticket Seller NO.1, get ticket:59
Ticket Seller NO.1, get ticket:41
Ticket Seller NO.1, get ticket:67
Ticket Seller NO.2, get ticket:63
Ticket Seller NO.2, get ticket:87
Ticket Seller NO.2, get ticket:23
Ticket Seller NO.1, get ticket:80
Ticket Seller NO.2, get ticket:36
Ticket Seller NO.2, get ticket:20
Ticket Seller NO.3, get ticket:9
Ticket Seller NO.1, get ticket:6
Ticket Seller NO.3, get ticket:81
Ticket Seller NO.2, get ticket:82
Ticket Seller NO.3, get ticket:38
Ticket Seller NO.1, get ticket:19
Ticket Seller NO.3, get ticket:26
Ticket Seller NO.2, get ticket:1
Ticket Seller NO.3, get ticket:84
Ticket Seller NO.1, get ticket:51
Ticket Seller NO.3, get ticket:89
Ticket Seller NO.2, get ticket:31
Ticket Seller NO.3, get ticket:2
Ticket Seller NO.1, get ticket:34
Ticket Seller NO.3, get ticket:78
Ticket Seller NO.2, get ticket:11
Ticket Seller NO.3, get ticket:83
Ticket Seller NO.1, get ticket:73
Ticket Seller NO.3, get ticket:61
Ticket Seller NO.2, get ticket:56
Ticket Seller NO.3, get ticket:68
Ticket Seller NO.1, get ticket:16
Ticket Seller NO.3, get ticket:48
Ticket Seller NO.2, get ticket:18
Ticket Seller NO.3, get ticket:4
Ticket Seller NO.1, get ticket:49
Ticket Seller NO.1, get ticket:53
Ticket Seller NO.1, get ticket:85
Ticket Seller NO.1, get ticket:13
Ticket Seller NO.1, get ticket:57
Ticket Seller NO.3, get ticket:93
Ticket Seller NO.3, get ticket:42
Ticket Seller NO.3, get ticket:46
Ticket Seller NO.3, get ticket:44
Ticket Seller NO.3, get ticket:58
Ticket Seller NO.3, get ticket:70
Ticket Seller NO.3, get ticket:33
Ticket Seller NO.3, get ticket:76
Ticket Seller NO.3, get ticket:47
Ticket Seller NO.3, get ticket:92
Ticket Seller NO.3, get ticket:55
Ticket Seller NO.3, get ticket:75
Ticket Seller NO.3, get ticket:96
Ticket Seller NO.3, get ticket:77
Ticket Seller NO.3, get ticket:45
Ticket Seller NO.3, get ticket:28
Ticket Seller NO.3, get ticket:88
Ticket Seller NO.3, get ticket:72
Ticket Seller NO.3, get ticket:8
Ticket Seller NO.3, get ticket:10
Ticket Seller NO.3, get ticket:62
Ticket Seller NO.3, get ticket:24
Ticket Seller NO.3, get ticket:86
Ticket Seller NO.3, get ticket:97
Ticket Seller NO.3, get ticket:5
Ticket Seller NO.3, get ticket:21
Ticket Seller NO.3, get ticket:0
Ticket Seller NO.3, get ticket:7
Ticket Seller NO.3, get ticket:22
Ticket Seller NO.3, get ticket:54
Ticket Seller NO.3, get ticket:98
Ticket Seller NO.3, get ticket:95
Ticket Seller NO.3, get ticket:52
Ticket Seller NO.3, get ticket:66
Ticket Seller NO.3, get ticket:3
Ticket Seller NO.3, get ticket:50
Ticket Seller NO.3, get ticket:27
Ticket Seller NO.3, get ticket:40
Ticket Seller NO.3, get ticket:74
Ticket Seller NO.2, get ticket:25
Ticket Seller NO.2, get ticket:91
Ticket Seller NO.3, get ticket:94
Ticket Seller NO.3, get ticket:71
Ticket Seller NO.3, get ticket:65
Ticket Seller NO.3, get ticket:60
Ticket Seller NO.3, get ticket:29
Ticket Seller NO.3, get ticket:35
Ticket Seller NO.3, get ticket:90
Ticket Seller NO.3, get ticket:43
Ticket Seller NO.3, get ticket:39
Ticket Seller NO.3, get ticket:69
Ticket Seller NO.3, get ticket:37
Ticket Seller NO.3, get ticket:14
Ticket Seller NO.3, get ticket:99
Ticket Seller NO.3, get ticket:32
Ticket Seller NO.3, get ticket:12
Ticket Seller NO.3, get ticket:64
Ticket Seller NO.3, get ticket:30
Ticket Seller NO.3, get ticket:79
Ticket Seller NO.3, sold out.
Ticket Seller NO.1, get ticket:15
Ticket Seller NO.1, sold out.
Ticket Seller NO.2, get ticket:17
Ticket Seller NO.2, sold out.

参考文章:http://www.cnblogs.com/vamei/archive/2013/04/15/3000898.html

java的多线程初体验的更多相关文章

  1. Apache Beam入门及Java SDK开发初体验

    1 什么是Apache Beam Apache Beam是一个开源的统一的大数据编程模型,它本身并不提供执行引擎,而是支持各种平台如GCP Dataflow.Spark.Flink等.通过Apache ...

  2. JAVA多线程-初体验

    一.线程和进程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 进程是所有线程的集合,每一个线程是进程中的一条执行路径. 二.为什么使用多线程,哪些场景下使用 多线程的好处是提高程序 ...

  3. 阿里云部署Java web项目初体验(转)/linux 上配置jdk和安装tomcat

    摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在阿里云上部署Java web项目. 一.准备工作 购买了阿里云的云解析,和云服务器ecs. 2.下载put ...

  4. 阿里巴巴 Java 开发规约插件初体验

    阿里巴巴 Java 开发手册 又一次来谈<阿里巴巴 Java 开发手册>,经过这大半年的版本迭代,这本阿里工程师们总结出来避免写出那么多 Bug 的规范,对于 Java 开发者简直就是必备 ...

  5. java画图之初体验

    1.实现画图程序所需的API类 JFrame JButton ActionListener              动作事件接口 ActionEvent                        ...

  6. 阿里云部署Java web项目初体验(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在 ...

  7. java -ui自动化初体验

    本文来讲一下ui自动化的环境搭建,以及最初级的打开网页操作 说起ui自动化,想想大概是前年的时候我开始接触和学习的吧,怎么说呢无论是pc还是app,ios还是android,确实很神奇而且很华丽,但是 ...

  8. 阿里云部署Java web项目初体验

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了怎样在阿里云上安装JDK.Tomcat以及其配置过程. 最后以一个实例来演 ...

  9. 【阿里云产品公测】消息队列服务MQS java SDK 机器人应用初体验

    [阿里云产品公测]消息队列服务MQS java SDK 机器人应用初体验 作者:阿里云用户啊里新人   初体验 之 测评环境 由于MQS支持外网访问,因此我在本地做了一些简单测试(可能有些业余),之后 ...

随机推荐

  1. Hierarchy Viewer工具使用

    目前,在eclipse的ADT Android插件中,还不能启动Hierachy Viewer,但可以从Android SDK工具包中,通过命令行的方式可以启动,具体方法为,到Android SDK下 ...

  2. CollectioView滚动到指定section的方法

    项目中的需求:collectionView顶部有一个scrollView组成的标签,点击标签,让collectionView滚动到指定的行,滚动collectionView自动切换到顶部指定的标签 实 ...

  3. Ultimus BPM 通信和运营商行业应用解决方案

    Ultimus BPM 通信和运营商行业应用解决方案 行业应用需求 电信运营商的主要职能是维护庞大的通信网络和向电信用户提供固话通讯.手机通讯.数据通讯及相关的附加增值服务,其组织特点是工种多.分工细 ...

  4. 开涛spring3(9.3) - Spring的事务 之 9.3 编程式事务

    9.3  编程式事务 9.3.1  编程式事务概述 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理. Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是 ...

  5. fiddler导致页面确定按钮无法使用(测试遇到的问题经验)

    这几天在测试的是遇到几个问题,就是在删除或者保存有些提示信息的时候 比如下面这种: 点击确定的时候,一直无响应,换了几台电脑其他电脑都是正常的,本机清楚缓存.关闭浏览器重新打开.重启电脑都试过了了就是 ...

  6. Windows平台下python2和3的兼容问题解决

    很多朋友都安装了python2和3,因为用些库例如scapy,不是scrapy,python3下面都是错,那么怎么让python2和3共存呢. 像一般的程序员,达到如下效果 Windows平台下的兼容 ...

  7. Android6.0-运行时权限处理

    为什么需要有运行时权限? 大家都知道在Android6.0之前,权限在应用安装过程中只询问一次,以列表的形式展现给用户,如果点击取消(即不认可应用所申请的权限),则会取消应用的安装.而用户出于安装应用 ...

  8. OVS + dpdk 安装与实验环境配置

    ***DPDK datapath的OVS的安装与实验环境配置 首先肯定是DPDK的安装       0:安装必要的工具            make            gcc           ...

  9. 使用DotNetty编写跨平台网络通信程序

    长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架.终于微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点, ...

  10. 导入java项目时出现红色叹号问题的解决

    问题:导入java项目时出现红色叹号(如下图所示) 原因:引入项目的某些jar包跟自己电脑上的位置不一样: 解决方案:步骤如下 (1)右键红色叹号所在项目————>build path————& ...