题目如下:
设计一个多线程程序,模拟银行业务办理。应包括:
  1)模拟客户可以随机办理银行提供的8种业务中的一种;
  2)3个业务处理线程模拟银行营业员处理业务,业务处理时间按照业务类型而变化;
  3)使用随机数时间模拟客户到达银行需要办理不同业务,客户需要办理何种业务也从银行可办理业务中随机生成;
  4)在处理完200个业务后打印出客户列表,包括以下项目:
  (客户名称,客户到达时间,客户办理业务类型,客户所用时间)
  5)计算并打印客户平均办理业务时间;
代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Random;public class Bank {
public static void main(String args[]) {
Admin admin = new Admin();
admin.admin1.start();
admin.admin2.start();
admin.admin3.start();
}public static Date randomDate(String beginDate, String endDate) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date start = format.parse(beginDate);// 构造开始日期
Date end = format.parse(endDate);// 构造结束日期
// getTime()表示返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
if (start.getTime() >= end.getTime()) {
return null;
}
long date = random(start.getTime(), end.getTime());
return new Date(date);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}private static long random(long begin, long end) {
long rtn = begin + (long) (Math.random() * (end - begin));
// 如果返回的是开始时间和结束时间,则递归调用本函数查找随机值
if (rtn == begin || rtn == end) {
return random(begin, end);
}
return rtn;
}
}class Admin implements Runnable {
Thread admin1, admin2, admin3;
static int count;Admin() {
admin1 = new Thread(this);
admin2 = new Thread(this);
admin3 = new Thread(this);
count = 0;
}public void run() {
// TODO 自动生成方法存根
if (Thread.currentThread() == admin1) {
work();
} else if (Thread.currentThread() == admin2) {
work();
} else if (Thread.currentThread() == admin3) {
work();
}
}public void work() {
Random rnd = new Random();
while (count <= 200) {
int yewu = rnd.nextInt(8);
switch (yewu) {
case 0:
KH kh = new KH();
kh.start();
Thread.yield();
break;
case 1:
CK ck =new CK();
ck.start();
Thread.yield();
break;
case 2:
QK qk=new QK();
qk.start();
break;
case 3:
DK dk=new DK();
dk.start();
Thread.yield();
break;
case 4:
ZZ zz=new ZZ();
zz.start();
Thread.yield();
break;
case 5:
TZ tz=new TZ();
tz.start();
Thread.yield();
break;
case 6:
XT xt=new XT();
xt.start();
Thread.yield();
break;
case 7:
RZ rz=new RZ();
rz.start();
Thread.yield();
break;
default:
System.out.println("处理业务业务失败");
}
count++;
System.out.println(count);
}
if (count == 201) {
System.out.println("客户名称 客户到达时间 客户办理业务类型 客户所用时间");
Iterator it = infotable.info.iterator();
while (it.hasNext()) {
User us;
us = (User) it.next();
System.out.println(us.name + " " + us.begintime + " "
+ us.type + " " + us.usetime);
}
}
}
}class KH extends Thread {
Date time = new Date();
KH() {
time.setHours(0);
time.setMinutes(15);
time.setSeconds(10);
}
public void run() {
Random rnd = new Random();
String name = String.valueOf(rnd.nextInt(20));
Date randomtime = Bank.randomDate("2011-1-1", "2011-12-30");
User user = new User(name, randomtime.toString(), time.toString(), "开户");
infotable.info.add(user);
System.out.println("KH");
}
}class QK extends Thread {
Date time = new Date();
QK() {
time.setHours(0);
time.setMinutes(15);
time.setSeconds(10);
}public void run() {
Random rnd = new Random();
String name = String.valueOf(rnd.nextInt(20));
Date randomtime = Bank.randomDate("2011-1-1", "2011-12-30");
User user = new User(name, randomtime.toString(), time.toString(), "取款");
infotable.info.add(user);
System.out.println("qk");
}
}class CK extends Thread {
Date time = new Date();CK() {
time.setHours(0);
time.setMinutes(15);
time.setSeconds(10);
}public void run() {
Random rnd = new Random();
String name = String.valueOf(rnd.nextInt(20));
Date randomtime = Bank.randomDate("2011-1-1", "2011-12-30");
User user = new User(name, randomtime.toString(), time.toString(), "存款");
infotable.info.add(user);
System.out.println("ck");
}
}class DK extends Thread {
Date time = new Date();
DK() {
time.setHours(0);
time.setMinutes(15);
time.setSeconds(10);
}public synchronized void run() {
Random rnd = new Random();
String name = String.valueOf(rnd.nextInt(20));
Date randomtime = Bank.randomDate("2011-1-1", "2011-12-30");
User user = new User(name, randomtime.toString(), time.toString(), "贷款");
infotable.info.add(user);
System.out.println("dk");
}
}class ZZ extends Thread {
Date time = new Date();
ZZ() {
time.setHours(0);
time.setMinutes(15);
time.setSeconds(10);
}public synchronized void run() {
Random rnd = new Random();
String name = String.valueOf(rnd.nextInt(20));
Date randomtime = Bank.randomDate("2011-1-1", "2011-12-30");
User user = new User(name, randomtime.toString(), time.toString(), "转账");
infotable.info.add(user);
}
}class TZ extends Thread {
Date time = new Date();TZ() {
time.setHours(0);
time.setMinutes(15);
time.setSeconds(10);
}public synchronized void run() {
Random rnd = new Random();
String name = String.valueOf(rnd.nextInt(20));
Date randomtime = Bank.randomDate("2011-1-1", "2011-12-30");
User user = new User(name, randomtime.toString(), time.toString(), "投资");
infotable.info.add(user);
}
}class XT extends Thread {
Date time = new Date();XT() {
time.setHours(0);
time.setMinutes(15);
time.setSeconds(10);
}public synchronized void run() {
Random rnd = new Random();
String name = String.valueOf(rnd.nextInt(20));
Date randomtime = Bank.randomDate("2011-1-1", "2011-12-30");
User user = new User(name, randomtime.toString(), time.toString(), "信托");
infotable.info.add(user);
}
}class RZ extends Thread {
Date time = new Date();RZ() {
time.setHours(0);
time.setMinutes(15);
time.setSeconds(10);
}public synchronized void run() {
Random rnd = new Random();
String name = String.valueOf(rnd.nextInt(20));
Date randomtime = Bank.randomDate("2011-1-1", "2011-12-30");
User user = new User(name, randomtime.toString(), time.toString(), "融资");
infotable.info.add(user);
}
}class infotable {
static LinkedList<User> info = new LinkedList<User>();
}鄙人的问题在于每次都是执行完WORK()方法后才会执行KH、qk等线程,Thread.yield()方法为什么没有让这个线程转移CPU的使用权限呢?如何才能实现中途跳转到KH、qk等线程去呢?