这部分学习给我的第一感觉就是程序设计方面,对于业务逻辑的理解难于具体代码的编写。对于这个交通信号等系统如果我有开车的经验那就容易多了,我基本是个车盲,也从来没仔细观察过交通信号灯。
改天仔细去路口看看再做,我先做银行调度系统吧。毕竟比较熟。
不过一不小心做出来了,也不知道是不是符合说明的要求。
银行系统,先实现生成客户的功能
public class Bank {
public static void main(String[] args) {
new gate().run();
}
}
class client{//封装用户对象,带有用户类型和办理业务所需时间(随机生成)
int type = 0;//0为vip用户,1为普通用户,2为快速用户
int time = 0;//办理业务时间最大为10,最小为1
client(){
int i = (int) (Math.random()*10);
if(i==0){type = 0;}
if(i>0&i<7){type = 1;}
if(i>6){type = 2;}//按给定概率生成客户对象
if(type == 2){//如果是快速客户,则办理业务时间为最短
this.time = 1;
}else this.time = (((int)(Math.random()*10))+1);
}
public int gettype() {
return type;
}
public int gettime() {
return time;
}
}
class gate extends Thread { //我计划分6个线程分别产生用户对象,用户从门进来么所以用gate做类名。
public void run() {
while(true){
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(((int)(Math.random()*2))==1){
client c = new client();
int type = c.gettype();
int time = c.gettime();
System.out.println("新增客户"+type+" "+time);
}else{
System.out.println("没有产生客户");
}
}//没500毫秒有50%的概率创建一个用户
}
}
运行结果相当满意,
没有产生客户
新增客户1 7
没有产生客户
没有产生客户
新增客户1 1
新增客户1 9
没有产生客户
没有产生客户
没有产生客户
没有产生客户
没有产生客户
新增客户2 1
新增客户1 7
没有产生客户
新增客户1 9
没有产生客户
新增客户1 3
没有产生客户
新增客户0 2
没有产生客户
没有产生客户
没有产生客户
新增客户1 6
感觉有点不对劲,原来调用的是gate的run方法,而没有调用start启动线程。稍稍改动一下再试试
public static void main(String[] args) {
for(int i=1;i<=6;i++){
new gate().start();
System.out.println(i+"号门开始接待客户");
}
}
1号门开始接待客户
2号门开始接待客户
3号门开始接待客户
4号门开始接待客户
5号门开始接待客户
6号门开始接待客户
没有产生客户
没有产生客户
没有产生客户
新增客户2 1
新增客户2 1
新增客户1 4
没有产生客户
新增客户1 5
新增客户2 1
新增客户1 8
没有产生客户
没有产生客户
没有产生客户
新增客户1 5
没有产生客户
没有产生客户
没有产生客户
没有产生客户
没有产生客户
没有产生客户
新增客户1 5
新增客户0 4
新增客户1 6
新增客户0 4
没有产生客户
没有产生客户
没有产生客户
没有产生客户
新增客户2 1
新增客户1 5
新增客户2 1
新增客户2 1
新增客户1 1
没有产生客户
没有产生客户
没有产生客户
没有产生客户
新增客户1 7
没有产生客户
新增客户1 2
新增客户1 2
新增客户2 1
但是用6个线程分别生成用户的速度太快了,我觉得把生成速度改慢点方便观察。继续下一步的完善。
几个小时后。。。。
呵呵不小心一下子把代码写完了,又写又改的用了3个多小时呢,一起贴上来吧,注解写的很详细我就不额外解释了。
import java.util.ArrayList;
public class Bank {
static ArrayList normalclient = new ArrayList();//存放普通客户
static ArrayList quickclient = new ArrayList();//存放快速用户
static ArrayList vipclient = new ArrayList();//存放vip用户
static int allnormalclient ;
static int allquickclient ;
static int allvipclient ;
static int endnormalclient ;
static int endquickclient ;
static int endvipclient ;
public static void main(String[] args) {
for(int i=1;i<=6;i++){
new gate().start();
System.out.println(i+"号门开始接待客户");
}
new normalwindow().start();
new normalwindow().start();
new normalwindow().start();
new normalwindow().start();
new quickwindow().start();
new vipwindow().start();
new allrecords().start();
}
}
class client{//封装用户对象,带有用户类型和办理业务所需时间(随机生成)
int type = 0;//0为vip用户,1为普通用户,2为快速用户
int time = 0;
client(){
int i = (int) (Math.random()*10);
if(i==0){type = 0;}
if(i>0&i<7){type = 1;}
if(i>6){type = 2;}
if(type == 2){
this.time = 100;
}else this.time = (((int)(Math.random()*10))+1)*100;/*最小时间是100,最大为1000,因为计划有6个门以500毫秒有50%的概率产生客户
所以对应6个窗口最大处理时间为1000,则会出现的状况是有时客户较少,各种客户
到对应窗口办理业务,而有时客户较多,个窗口开始协调办理业务。但总的客户数量
是银行可以负担的。*/
}
public int gettype() {
return type;
}
public int gettime() {
return time;
}
}
class gate extends Thread { //我计划分6个线程分别产生用户对象,用户从门进来么所以用gate做类名。
public void run() {
while(true){
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(((int)(Math.random()*2))==1){
client c = new client();
int type = c.gettype();
int time = c.gettime();
if(type == 1){Bank.normalclient.add(c);Bank.allnormalclient++; }
if(type == 2){Bank.quickclient.add(c);Bank.allquickclient++;}
if(type == 0){Bank.vipclient.add(c);Bank.allvipclient++;}
/*System.out.println("新增客户"+type+" "+time);
}else{
System.out.println("没有产生客户");*/
}
//System.out.println(Bank.normalclient.size());
}/*最小时间是100,最大为1000,因为计划有6个门以500毫秒有50%的概率产生客户
所以对应6个窗口最大处理时间为1000,则会出现的状况是有时客户较少,各种客户
到对应窗口办理业务,而有时客户较多,个窗口开始协调办理业务。但总的客户数量
是银行可以负担的。*/
}
}
class normalwindow extends Thread {
public void run(){
try {
sleep(5000);//先让他睡5秒能客户上来,不然会报错地。
} catch (InterruptedException e1) {
e1.printStackTrace();
}
while(true){
if(Bank.normalclient.isEmpty()){/*暂无客户*/}else{
int time = 0;
synchronized(Bank.normalclient){
client c = (client)Bank.normalclient.get(0);
time = c.gettime();
Bank.normalclient.remove(0);
}
try {
sleep(time);//这是表示正在处理业务,同时也释放了锁定下一个线程可以拿到任务了。
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口"+Thread.currentThread().getName()+"处理完普通用户"+"用时"+time);
Bank.endnormalclient++;
}
}
}
}
class quickwindow extends Thread {
public void run (){
while(true){
if(Bank.quickclient.isEmpty()){
if(Bank.normalclient.size()>4){
int time = 0;
synchronized(Bank.normalclient){
client c = (client)Bank.normalclient.get(4);
time = c.gettime();
Bank.normalclient.remove(4);
}
try {
sleep(time);//这是表示正在处理业务,同时也释放了锁定下一个线程可以拿到任务了。
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口"+Thread.currentThread().getName()+"处理完普通用户"+"用时"+time);
Bank.endnormalclient++;//已完成普通客户+1
}
}else{
Bank.quickclient.remove(0);
try {
sleep(100);//快速客户用时间最短
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口"+Thread.currentThread().getName()+"处理完成快速客户"+"用时"+100);
Bank.endquickclient++;//已完成快速客户+1
}
}
}
}
class vipwindow extends Thread {
public void run (){
while(true){
if(Bank.vipclient.isEmpty()){
if(Bank.normalclient.size()>5){//长度大于5代表前五个窗口已满则6好窗口无vip用户是协助完成;
int time = 0;
synchronized(Bank.normalclient){
client c = (client)Bank.normalclient.get(5);
time = c.gettime();
Bank.normalclient.remove(5);
}
try {
sleep(time);//这是表示正在处理业务,同时也释放了锁定下一个线程可以拿到任务了。
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口"+Thread.currentThread().getName()+"处理完普通用户"+"用时"+time);
Bank.endnormalclient++;//已完成普通客户+1
}
}else{
int time =0;
client c = (client)Bank.vipclient.get(0);
time = c.gettime();
Bank.vipclient.remove(0);
try {
sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口"+Thread.currentThread().getName()+"处理完成vip客户"+"用时"+time);
Bank.endvipclient++;
}
}
}
}
class allrecords extends Thread{//最后完善一下,每隔20秒统计一次所有数据
public void run(){
while(true){
try {
sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int all = Bank.allnormalclient+Bank.allquickclient+Bank.allvipclient;
int end = Bank.endnormalclient+Bank.endquickclient+Bank.endvipclient;
System.out.println("累计所有客户"+all+"人"+"已经处理"+end+"人");
System.out.println("其中普通客户"+Bank.allnormalclient+"人"+"已处理"+Bank.endnormalclient+"人");
System.out.println("其中快速客户"+Bank.allquickclient+"人"+"已处理"+Bank.endquickclient+"人");
System.out.println("其中vip客户"+Bank.allvipclient+"人"+"已处理"+Bank.endvipclient+"人");
}
}
}
OK了然后发下运行结果,是前20秒的,就不多发了。0到5号线程是6个独立产生客户的线程,6号到11号线程分别是6个服务窗口线程,10号为快速客户窗口,11号为vip客户窗口。
1号门开始接待客户
2号门开始接待客户
3号门开始接待客户
4号门开始接待客户
5号门开始接待客户
6号门开始接待客户
窗口Thread-10处理完成快速客户用时100
窗口Thread-11处理完成vip客户用时500
窗口Thread-10处理完成快速客户用时100
窗口Thread-10处理完成快速客户用时100
窗口Thread-11处理完成vip客户用时700
窗口Thread-10处理完成快速客户用时100
窗口Thread-10处理完普通用户用时100
窗口Thread-11处理完成vip客户用时900
窗口Thread-10处理完普通用户用时400
窗口Thread-11处理完成vip客户用时900
窗口Thread-11处理完成vip客户用时600
窗口Thread-10处理完普通用户用时1000
窗口Thread-10处理完成快速客户用时100
窗口Thread-10处理完成快速客户用时100
窗口Thread-9处理完普通用户用时100
窗口Thread-7处理完普通用户用时200
窗口Thread-11处理完成vip客户用时1000
窗口Thread-10处理完普通用户用时700
窗口Thread-9处理完普通用户用时300
窗口Thread-6处理完普通用户用时500
窗口Thread-10处理完成快速客户用时100
窗口Thread-8处理完普通用户用时700
窗口Thread-7处理完普通用户用时500
窗口Thread-11处理完成vip客户用时800
窗口Thread-7处理完普通用户用时400
窗口Thread-9处理完普通用户用时700
窗口Thread-10处理完成快速客户用时100
窗口Thread-6处理完普通用户用时700
窗口Thread-8处理完普通用户用时800
窗口Thread-10处理完成快速客户用时100
窗口Thread-7处理完普通用户用时600
窗口Thread-6处理完普通用户用时600
窗口Thread-11处理完成vip客户用时700
窗口Thread-9处理完普通用户用时900
窗口Thread-8处理完普通用户用时700
窗口Thread-6处理完普通用户用时300
窗口Thread-11处理完成vip客户用时300
窗口Thread-7处理完普通用户用时600
窗口Thread-6处理完普通用户用时200
窗口Thread-8处理完普通用户用时200
窗口Thread-9处理完普通用户用时500
窗口Thread-8处理完普通用户用时400
窗口Thread-9处理完普通用户用时100
窗口Thread-10处理完成快速客户用时100
窗口Thread-6处理完普通用户用时400
窗口Thread-8处理完普通用户用时900
窗口Thread-9处理完普通用户用时800
窗口Thread-6处理完普通用户用时800
窗口Thread-11处理完成vip客户用时400
窗口Thread-7处理完普通用户用时1000
窗口Thread-7处理完普通用户用时200
窗口Thread-9处理完普通用户用时500
窗口Thread-8处理完普通用户用时1000
窗口Thread-6处理完普通用户用时900
窗口Thread-9处理完普通用户用时500
窗口Thread-8处理完普通用户用时600
窗口Thread-10处理完成快速客户用时100
窗口Thread-10处理完成快速客户用时100
窗口Thread-9处理完普通用户用时600
窗口Thread-10处理完成快速客户用时100
窗口Thread-6处理完普通用户用时1000
窗口Thread-10处理完成快速客户用时100
窗口Thread-8处理完普通用户用时200
窗口Thread-11处理完成vip客户用时1000
窗口Thread-11处理完成vip客户用时200
窗口Thread-8处理完普通用户用时500
窗口Thread-7处理完普通用户用时600
窗口Thread-10处理完成快速客户用时100
窗口Thread-6处理完普通用户用时200
窗口Thread-9处理完普通用户用时700
窗口Thread-11处理完成vip客户用时200
窗口Thread-7处理完普通用户用时300
窗口Thread-10处理完成快速客户用时100
窗口Thread-9处理完普通用户用时700
窗口Thread-8处理完普通用户用时300
窗口Thread-6处理完普通用户用时1000
窗口Thread-7处理完普通用户用时700
窗口Thread-10处理完成快速客户用时100
窗口Thread-6处理完普通用户用时400
窗口Thread-10处理完成快速客户用时100
窗口Thread-8处理完普通用户用时200
窗口Thread-9处理完普通用户用时1000
窗口Thread-10处理完成快速客户用时100
窗口Thread-7处理完普通用户用时300
窗口Thread-11处理完成vip客户用时300
窗口Thread-6处理完普通用户用时900
窗口Thread-8处理完普通用户用时400
窗口Thread-10处理完成快速客户用时100
窗口Thread-10处理完成快速客户用时100
窗口Thread-9处理完普通用户用时900
窗口Thread-8处理完普通用户用时500
窗口Thread-10处理完成快速客户用时100
窗口Thread-8处理完普通用户用时200
窗口Thread-7处理完普通用户用时400
窗口Thread-6处理完普通用户用时900
窗口Thread-11处理完成vip客户用时500
窗口Thread-6处理完普通用户用时100
窗口Thread-8处理完普通用户用时100
窗口Thread-8处理完普通用户用时100
窗口Thread-11处理完成vip客户用时700
窗口Thread-9处理完普通用户用时500
窗口Thread-9处理完普通用户用时400
窗口Thread-7处理完普通用户用时1000
窗口Thread-10处理完成快速客户用时100
窗口Thread-7处理完普通用户用时100
窗口Thread-6处理完普通用户用时900
窗口Thread-8处理完普通用户用时900
窗口Thread-10处理完成快速客户用时100
窗口Thread-9处理完普通用户用时700
累计所有客户112人已经处理109人
其中普通客户72人已处理69人
其中快速客户24人已处理24人
其中vip客户16人已处理16人