使用多线程模拟一个银行叫号窗口

使用继承Thread类的方式创建线程

银行叫号部分的代码

package com.dwz.concurrency.chapter2;
/**
 *    使用static保证号码数据共享
 *    线程的创建方式:继承Thread类
 */
public class TicketWindow extends Thread{
    private static final int MAX = 100;
    //号码
    private static int index = 1;
    private final String name;

    public TicketWindow(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        while(index <= MAX) {
            System.out.println(name + "当前的号码是:" + (index++));
        }
    }
}

测试代码:

package com.dwz.concurrency.chapter2;

public class Bank {
    public static void main(String[] args) {
        TicketWindow tw = new TicketWindow("一号柜台");
        tw.start();

        TicketWindow tw2 = new TicketWindow("二号柜台");
        tw2.start();

        TicketWindow tw3 = new TicketWindow("三号柜台");
        tw3.start();
    }
}

使用实现Runnable接口的方式创建线程

银行叫号部分的代码

package com.dwz.concurrency.chapter2;
/**
 * 实现业务逻辑和线程的分离
 */
public class TicketWindowRunnable implements Runnable {
    private static final int MAX = 100000;
    private int index = 1;

    public void run() {
        while(index <= MAX) {
            System.out.println(Thread.currentThread().getName() + " 的号码是:" + (index++));
        }
    }
}

测试代码:

package com.dwz.concurrency.chapter2;
/**
 * 此方式可以保证TicketWindowRunnable类被实例化一次
 * 三个线程共用一个TicketWindowRunnable对象,达到共享号码的目的
 */
public class BankVersion2 {
    public static void main(String[] args) {
        TicketWindowRunnable wr = new TicketWindowRunnable();
        Thread thread1 = new Thread(wr, "柜台一");
        Thread thread2 = new Thread(wr, "柜台二");
        Thread thread3 = new Thread(wr, "柜台三");

        thread1.start();
        thread2.start();
        thread3.start();
    }
}

原文地址:https://www.cnblogs.com/zheaven/p/12028785.html

时间: 2024-08-02 13:23:16

使用多线程模拟一个银行叫号窗口的相关文章

java模拟一个抽奖程序

今天用一个程序模拟一个从1-32之间,随机抽取7组号码的抽奖程序 * 需要使用Java的图形界面知识 * 窗口  JFrame * 面板  JPanel * 显示文本信息的标签  JLabel * 文本框 JTextField * 按钮  JButton 还涉及到线程Thread 先看效果图: 但是这里留一个问题?就是去除重复数字(可以自己先实现,后期我会上传的) 下面看看代码,代码中有注释,不懂留言: package thread.test1; import java.awt.BorderLa

java多线程模拟生产者消费者问题,公司面试常常问的题。。。

package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 //Storage仓库 //批注:我把输出结果写在程序以下了,你能够看一下,事实上非常easy的,你想象一下产品从生产,到取出的一个生产线,我们定义两个线程,生产者线程,和消费者线程,一个是生产者不停的生产产品并放入数量有限的指定槽内,而消费者从指定槽依次取出产品,现实中的流水车间也相似于此. publ

100个线程同时向一个银行账户中存入1元钱

下面的例子演示了100个线程同时向一个银行账户中存入1元钱,在没有使用同步机制和使用同步机制情况下的执行情况. 银行账户类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /**  * 银行账户  * @author 骆昊  *  */ public class Account {     private double balance;     // 账户余额     /**   

使用无锁完成多线程模拟售票, 理解无锁是啥?

实现的模拟多线程实现售票是每个学习多线程的初学者必须要学会掌握的知识点, 既然掌握的它, 我们自然要举一反三 So~, 无锁版出现了 What无锁? 假如两个线程同时修改一个变量的场景下 我们需要三个值, 预期值(线程副本变量中的值), 主存值(从主存变量中的值), 新值(我们要设置的值) 如果 预期值 不等于 主存值 则忽略 新值 写入  =========> 这句话是一个原子操作, 是不可分割的(就是内存屏障), 在执行这个过程中, 是不会失去时间片的 如果 预期值 等于 主存值 则  新值

栈的应用之银行叫号系统模拟

#include <stdio.h> #define STACKSIZE 110 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef int Status; typedef struct { ElemType data[STACKSIZE]; int top; } SeqStack; Status StackEmpty(SeqStack s) { if(s.top==0) return FALSE; return TRUE;

C#中,一个cmd命令窗口执行多条dos命令(有修改,加入执行等待)

原文章标题:C# 程序一个cmd命令窗口执行多条dos命令 原文章地址:http://www.cnblogs.com/visibleisfalse/p/3578886.html 以下代码有修改,标出的红色代码,表示执行一条dos命令后,等待执行完成. public void DoDos(string comd1, string comd2, string comd3) { Process p = new Process();//创建进程对象 try { p.StartInfo.FileName

模拟一个下拉框

用sele标签写的页面总是不太好看,而且在不同的浏览器里显示的样子不同,大家都用div ul li 之类的模拟一个下拉框对其进行美化. 这里是在网上找的一个下拉框的例子,根据它修改完成的,明天试试看,能不能代替项目里的selec. 这里是GitHub地址

创建两个线程模拟火车站两个窗口售票程序

题目:创建两个线程模拟火车站两个窗口售票程序,窗口售票时间为1秒,两个窗口不能同时售票 #include<Windows.h> #include<iostream> using namespace std; //这是2个线程模拟买火车票的小程序 DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data int inde

java-第十三章-类的无参方法(一)-模拟一个简单的购房商贷月供计算器

package 本章总结; public class A02class { double Money = 0; public double showA(double money, int choice) { switch (choice) { case 1: Money = (money + money * 0.0603) / 36; break; case 2: Money = (money + money * 0.0612) / 60; break; case 3: Money = (mon