有点bug,有时程序会停住,导致最后一次的扣钱没有成功。
题目的要求是存钱时有上限,若超过上限,让给取钱线程运行。
取钱时有下限,如果超过下限让存钱线程运行。
但若存钱线程全部运行结束了,那么取钱线程就没有下限了,可以取到负数。
最后的答案应该是-100。
package com.jin.lv2;
public class BankOperation
{
public static void main(String[] args) throws Exception
{
int[] addList = new int[]{100, 300, 800, 500, 400, 200, 600, 700};
int[] takeList = new int[]{300, 800, 500, 400, 100, 700, 600, 300};
Balance balance = new Balance();
Thread adder = new Adder(balance, addList);
Thread taker = new Taker(balance, takeList);
System.out.print("List:");
adder.start();
taker.start();
Thread.sleep(500);
System.out.println("\nBalance:" + balance.getMoney()); //正确答案是 -100
}
}
class Balance {
private int money = 0;
boolean isAddOver = false;
public synchronized int getMoney()
{
return this.money;
}
public synchronized void add(int num) throws Exception
{
this.notifyAll();
while((money + num) > 1000)
{
this.wait();
//Thread.yield(); 不能使用yield(),yield虽然停了,但不会释放锁,别人操作不了balance了
}
money += num;
System.out.print("add" + num + ", ");
System.out.println("balance:" + money);
}
public synchronized void take(int num) throws Exception
{
this.notifyAll();
while((money - num) < 100 && !isAddOver)
{
this.wait();
System.out.println("陷入循环无法跳出。 此时的money=" + money + "此时isAddOver=" + isAddOver);
//Thread.yield(); 不能使用yield(),yield虽然停了,但不会释放锁,别人操作不了balance了
}
money -= num;
System.out.print("take" + num + ", ");
System.out.println("balance:" + money);
}
}
class Adder extends Thread {
private Balance balance;
private int[] addList;
public Adder(Balance balance, int[] addList)
{
this.balance = balance;
this.addList = addList;
}
public void run()
{
for(int i=0; i<addList.length; i++)
{
try
{
balance.add(addList[i]);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//balance.isAddOver = true; 不是合适的地方,最好在添加结束后立刻就设为true,所以保证在同步方法add最后搞
}
}
class Taker extends Thread {
private Balance balance;
private int[] takeList;
public Taker(Balance balance, int[] takeList)
{
this.balance = balance;
this.takeList = takeList;
}
public void run()
{
for(int i=0; i<takeList.length; i++)
{
try
{
balance.take(takeList[i]);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
python计算机二级题库(附带答案)python计算机二级题库(附带答案)python计算机二级题库(附带答案)python计算机二级题库(附带答案)python计算机二级题库(附带答案)python计算机二级题库(附带答案)python...
四川省计算机二级笔试真题答案(C语言19-30).rar 四川省计算机二级笔试真题软件基础部分(C语言19-30).rar 四川省计算机二级机试真题(C语言18-30).rar 四川省计算机二级机试真题答案(C语言18-30).rar 四川省...
标题和描述中提到的“2014年全国计算机等级二级考试高级Office试题及答案汇总”是一个宝贵的备考资源,它包含了当年考试的所有题目以及对应的参考答案。对于考生来说,这是一个了解考试题型、检验自我学习效果、提高...
浙江省计算机二级上机操作题答案.pdf
计算机二级考试C语言历年试题及答案,文档,
2009年计算机二级VB试题 及2009年计算机二级VB试题参考答案
【计算机二级 WPS Office高级应用与设计题库及答案】主要涵盖了WPS Office软件的深入理解和实际操作技能,这是针对全国计算机等级考试二级WPS Office科目的重要学习资源。WPS Office是由金山软件公司开发的一款全面...
全国计算机二级MYSQL考试题库(含答案).pdf
从文件描述来看,文档提供了针对计算机二级C语言考试的上机题库及参考答案,题库覆盖了填空题、改错题、编程题等多种题型。下面我将针对文档中提供的部分内容,详细解析知识点: 1. 阶乘的递归求解 阶乘的计算是...
全国计算机二级C++等级考试真题及答案.pdf 本资源总结了全国计算机二级C++等级考试的真题及答案,涵盖了C++语言的基础知识和高级应用。该资源共包含20个真题,涵盖了C++语言的变量存储类型、类和对象、继承、运算符...
这个是标准的二级C语言题库,只要把这个题库里的题稍微看一下,考二级C语言绝对没问题。才开始可能感觉题多,但是只要仔细一看,很多题就是改了出题形式,内容完全一样,所以很容易学。另外,大家注意,由于我的疏忽...
历年二级考试题目及参考答案 历年二级考试题目及参考答案 历年二级考试题目及参考答案
这个压缩包文件包含了2017年的CFA二级mock试题和答案,是备考者宝贵的复习资源。 Mock试题是模拟真实考试环境的练习题,对于CFA考生来说至关重要。它们可以帮助考生熟悉考试格式,了解题型分布,以及提高在有限时间...
《日语能力考试二级真题及答案(1991-2011.12)》是一个集合了二十一年间日语能力考试二级的完整试题与答案的资源包,对于学习者而言,这是一个极其宝贵的参考资料。日语能力考试,全称为日本语能力测试(JLPT),是...
计算机二级历年真题+答案详解 计算机 二级 真题+ 答案 详解
"2023年全国计算机二级C语言试题与答案" 本资源是2023年全国计算机二级C语言试题与答案的PDF文件,涵盖了C语言的基本概念、语法、函数、变量、数据类型、运算符、控制结构、数组、指针、结构体、文件操作等方面的...
历年计算机二级MS_Office真题及答案 本资源摘要信息涵盖了计算机二级考试的MS_Office真题及答案,涵盖了计算机科学的基础知识,包括计算机的发展史、计算机的基本结构、计算机的应用领域、计算机的基本原理、计算机...
很好 棒极了,里面有上百道二级试题及参考答案还有详解,觉得不错,大家分享一下
计算机等级二级C语言考试试题和答案详解。