| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 824 人关注过本帖
标题:java多线程找零问题,我想知道我的程序运行后为什么得不到正确的结果?
只看楼主 加入收藏
lovefan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:53
注 册:2013-3-16
结帖率:75%
收藏
已结贴  问题点数:10 回复次数:5 
java多线程找零问题,我想知道我的程序运行后为什么得不到正确的结果?
在线求高手解决:

package Exercise2;

import java.awt.*;
import javax.swing.*;

public class ThreadTest_02 {
    static SalesLady saleslady = new SalesLady(14, 0, 0, 0);

    public static void main(String[] args) {
        new ThreadTest_02().start();
    }

    public void start() {
        int moneies[] = { 10, 20, 5, 10, 5, 10, 5, 50, 100, 10, 5, 10, 20, 5,
                10, 5 };
        Thread[] aThreadArray = new Thread[moneies.length];
        System.out.println("现在开始售票:");
        for (int i = 0; i < moneies.length; i++) {
            aThreadArray[i] = new Thread(new CustomerClass(i + 1, moneies[i]));
            aThreadArray[i].start();
        }
        for (int i = 0; i < moneies.length; i++) {
            try {
                aThreadArray[i].join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("票已售完");
    }
}

// 顾客 销售人员
class SalesLady {
    int memontoes, five, ten, twenty, fifty, hundred;
    String s = null;

    SalesLady(int m, int f, int t, int ty) {
        memontoes = m;
        five = f;
        ten = t;
        twenty = ty;
    }

    public synchronized String ruleForSale(int num, int money) {        
        if (memontoes <= 0)
            return s = "对不起,已经售完";
        if (money == 5) {            
            memontoes--;
            five++;        
            s = "给你票,你的钱正好。";
            notify();
        } else if (money == 10) {
            if (five >= 1) {
                memontoes--;
                five -= 1;
                ten++;
                s = "给你票,找你5元。";
            } else {
                s = num + "号顾客用10元购票,请等待";
//                notify();
                try {                    
                    wait();
                } catch (InterruptedException e) {
                }
            }
            notify();

        } else
            if (money == 20) {
        
            
            twentyGive();
            notify();
            
        } else if (money == 50) {
//            notify();
            fiftyGive();
//            notify();
        } else if(money == 100) {
            hundredGive();
            notify();
        }
        notifyAll();
        return s;            
    }

    public void twentyGive() {
        if (ten >= 1 && five >= 1) {
            s = "找您1个10元1个5元!";
            ten--;
            five--;
            twenty++;
            memontoes--;
        } else if (ten < 1 && five >= 3) {
            s = "给您球票,找您3个5元,请在球赛开始前进影院观看精彩比赛!";
            five -= 3;
            memontoes--;
            twenty++;
        } else {
            s = ": 不好意思,暂时没有零钱找,请稍等,!";
            try {
                wait();
            } catch (InterruptedException e) {
                s = " 不好意思,暂时没有零钱找,请稍等,!";
            }
        }
//        return ;

    }

    public void fiftyGive() {
        if (twenty >= 2 && five >= 1) {
            s = ": 给您球票,找您2个20元和1个5元,请在球赛开始前进影院观看精彩比赛!\n";
            five--;
            twenty -= 2;
            fifty++;
            memontoes--;
        } else if (twenty >= 1 && ten >= 2 && five >= 1) {
            s = ": 给您球票,找您1个20元2个10元和1个5元,请在球赛开始前进影院观看精彩比赛!\n";
            five--;
            twenty--;
            ten -= 2;
            fifty++;
            memontoes--;
        } else if (twenty < 1 && ten >= 4 && five >= 1) {
            s = ": 给您球票,找您45元钱,请在球赛开始前进影院观看精彩比赛!\n";
            five--;
            ten -= 4;
            fifty++;
            memontoes--;
        } else if (twenty < 1 && ten >= 3 && five >= 3) {
            s = ": 给您球票,找您45元钱,请在球赛开始前进影院观看精彩比赛!\n";
            five -= 3;
            ten -= 3;
            fifty++;
            memontoes--;
        } else if (twenty < 1 && ten >= 2 && five >= 5) {
            s = ": 给您球票,找您45元钱,请在球赛开始前进影院观看精彩比赛!\n";
            five -= 5;
            ten -= 2;
            fifty++;
            memontoes--;
        } else if (twenty < 1 && ten >= 1 && five >= 7) {
            s = ": 给您球票,找您45元钱,请在球赛开始前进影院观看精彩比赛!\n";
            five -= 7;
            ten--;
            fifty++;
            memontoes--;
        } else if (twenty < 1 && ten < 1 && five >= 9) {
            s = ": 给您球票,找您45元钱,请在球赛开始前进影院观看精彩比赛!\n";
            five -= 9;
            fifty++;
            memontoes--;
        } else {
            s = ": 不好意思,暂时没有零钱找,请稍等,!";
            try {
                wait();
            } catch (InterruptedException e) {
                System.out.println("等待状态!");
            }

        }
        notify();

    }

    /*
     * 100元找钱方法,使用最有方法找零钱
     */
    public void hundredGive() {
        if (fifty >= 1 && twenty >= 2 && five >= 1) {
            
            fifty--;
            twenty -= 2;
            five--;
            hundred++;
            memontoes--;
            s = ": 给您球票,找您95元钱,请在球赛开始前进影院观看精彩比赛!\n";
        } else if (fifty < 1 && twenty >= 4 && five >= 1) {
            
            five--;
            twenty -= 4;
            ten -= 4;
            hundred++;
            memontoes--;
            s = ": 给您球票,找您95元钱,请在球赛开始前进影院观看精彩比赛!\n";
        } else if (fifty < 1 && twenty >= 3 && ten >= 3 && five >= 1) {
            
            five--;
            ten -= 3;
            twenty -= 3;
            hundred++;
            memontoes--;
            s = ": 给您球票,找您95元钱,请在球赛开始前进影院观看精彩比赛!\n";
        } else if (fifty < 1 && twenty >= 2 && ten >= 5 && five >= 1) {
            
            five -= 1;
            ten -= 5;
            fifty++;
            memontoes--;
            s = ": 给您球票,找您95元钱,请在球赛开始前进影院观看精彩比赛!\n";
        } else if (fifty < 1 && twenty >= 1 && ten >= 7 && five >= 5) {
            
            five -= 5;
            ten -= 7;
            fifty++;
            memontoes--;
            s = ": 给您球票,找您95元钱,请在球赛开始前进影院观看精彩比赛!\n";
        } else {
            s = ": 不好意思,暂时没有零钱找,请稍等,!\n";
            try {
                wait();
            } catch (InterruptedException e) {
                System.out.println("等待状态!");
            }
        }
        notify();

    }
}

// 顾客
class CustomerClass implements Runnable {
    int num, money;

    public void run() {
        System.out.println("我是" + num + "号顾客,用" + money + "元购票\n售票员说:"
                + ThreadTest_02.saleslady.ruleForSale(num, money));
    }

    /*
     * 顾客编号及给的钱的数量
     */
    CustomerClass(int n, int m) {
        num = n;
        money = m;
    }
}
搜索更多相关主题的帖子: static package public import 
2013-05-19 19:34
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
收藏
得分:5 
建议不要用线程组了,是不是看的教材太老了。
2013-05-19 21:03
lovefan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:53
注 册:2013-3-16
收藏
得分:0 
请楼上的高手给出解决办法,感激不尽…………
2013-05-19 21:52
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
收藏
得分:0 
程序很乱,看不明白,先提出你的程序功能需求,
2013-05-21 13:22
lovefan
Rank: 2
等 级:论坛游民
帖 子:31
专家分:53
注 册:2013-3-16
收藏
得分:0 
使用图形化界面模拟多人排队买车票,假设车票5元一张,购票者有持5元、10元、20元、50元、100元的。已知排队者持钱情况序列,使用多线程模拟购票。
2013-05-21 18:54
阿里那个巴巴
Rank: 3Rank: 3
来 自:中山大学
等 级:论坛游侠
威 望:2
帖 子:55
专家分:153
注 册:2013-3-19
收藏
得分:5 
一楼真实高手,一眼就能看出楼主的教材过老,佩服佩服
2013-05-22 11:55
快速回复:java多线程找零问题,我想知道我的程序运行后为什么得不到正确的结果? ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022114 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved