TestQueue类public class TestQueue extends Thread { static NumberMachine machine = new NumberMachine(); public void run() {
System.out.println("开始运行线程"+this.getName());
int x = 0;
try {
for (;;) {// 
x = (int) (Math.random() * 5000);
sleep(x);
System.out.println("睡眠:"+x+"毫秒.");
System.out.println("打印出第" + machine.printNumber() + "张号码"); }
} catch (Exception e) {
e.printStackTrace();
System.out.println("消息:" + e.getMessage());
}
} public static void main(String[] str) { TestQueue t = new TestQueue();
int x = 0;
t.start();
try {
sleep(1000);
for (;;) {//这个for循环是什么意思?凭什么会进到这个里面?
x = (int) (Math.random() * 2000);
sleep(x);
if (machine.getMax() <= machine.getMin())
System.out.println("暂时没有客户来办理业务");
else
System.out.println(machine.finish() + "号顾客办理结束"); }
} catch (Exception e) {
e.printStackTrace();
System.out.println("消息:" + e.getMessage());
} }}
NumberMachine 类public class NumberMachine {
static List<Integer> list = new ArrayList<Integer>();
private int numberMax = 1;
private int numberMin = 1; public int printNumber() {
list.add(Integer.valueOf(numberMax++));
return numberMax - 1;
} public int finish() {
list.remove(Integer.valueOf(numberMin));
numberMin++;
return numberMin - 1;
} public int getMax() {
return numberMax;
} public int getMin() {
return numberMin;
}
}1:这个程序走的流程是这样的?
2:为什么我用eclipse调试永远都是打印“暂时没有客户来办理业务”?

解决方案 »

  1.   

    for(;;)就是无条件循环,相当于while(true)
    1 程序的流程是
    主程序会启动一个线程TestQueue,然后主程序无限循环,在循环中随机的sleep一段时间,然后获取线程的numberMax和numerMin来比较,如果numberMax小于等于numberMin,就打印“暂时没有客户来办理业务”,否则就打印“xxx号顾客办理结束"”,其中xxx是通过调用线程的finish而来的。
    另一方面,被主程序启动的线程也会进入一个无限循环,在循环中随机的sleep一段时间,然后打印睡眠的时间,再打印“打印出第xxx张号码”,其中xxx是通过调用自身的printNumber而来的2 为何会永远“暂时没有客户来办理业务”?从你的代码来分析就知道了,当主程序运行到比较线程的numberMax和numberMin的时候,numberMax下于等于numberMin就走到这个打印。再来看你的线程的执行,首先线程会创建一个NumberMachine对象machine,刚开始machine的numberMax和nunerMin都是1,然后线程执行进入循环,每次循环随机sleep一段时间后,就调用printNumber,而printNumber使得machine对象的numberMax减小1,每次循环每循环,numberMax就越来越小,而numberMin一直没变,所以numberMax就会小于numberMin,所以主程序的if (machine.getMax() <= machine.getMin())就会满足条件,主程序就会一直进入该if去执行打印,也就是一直打印“暂时没有客户来办理业务”