现实生活中,我们一边工作,一边消费,正常情况下会把多余的钱存起来,比如存到余额宝,还可以多挣点钱,现在就有这个情况:我每月可以发工资20000万元 (暂定每月的1号),每月消费5000(租房+生活费)元(暂定每月的1号),其中租金是大头占90%,交房租的方式可以选择(一月一交,两月一交、三月一交),理财:1万元存余额宝一天可以赚1元钱,想知道半年后的理财情况,选择哪种交房租的方式更省钱,具体省多少?
问题分析:这个问题属于于生产者—消费者模型,其中生产者—发工资+理财,消费者—交房租+生活费,其中银行账户作为储存容器,只不过这里跟普通的生产者—消费者模型不一样的是生产者和消费者的动作是指定的,因为日期是定下来的,那来吧直接动手实现吧!
package pc.d3; import java.util.Calendar; import java.util.Date; import util.DateUtils; /** * 日期对象 */ public class DateConstant { /**开始日期,默认是从2015-7-1开始 **/ private static Date nowDate = DateUtils.parseDate("2015-7-1"); public static Date getNowDate() { return nowDate; } public static String getNowDateForString(){ return DateUtils.formatTimestamp(getNowDate()); } /** * 表针走动 */ public static void timeRun(){ nowDate = DateUtils.addSecond(nowDate, 10); } public static boolean isEnd(){ Calendar calendar = Calendar.getInstance(); calendar.setTime(nowDate); //判断是否2015年12月31日 if(calendar.get(Calendar.YEAR)==2016){ return true; } return false; } }
package pc.d3; import org.apache.log4j.Logger; /** * 银行账户 */ public class Account { Logger logger = Logger.getLogger(Producer.class); /**账户金额,默认是0元 **/ private float allMoney = 0; public float getMoney(){ return allMoney; } /** * 消费 * @param money */ public boolean subMoney(float money){ if(money==0){ logger.info(DateConstant.getNowDateForString()+"取钱:银行账户没有钱,好穷啊"); return false; } float sourceMoney = allMoney; allMoney = allMoney - money; logger.info(DateConstant.getNowDateForString()+"取钱:"+sourceMoney+"-"+money+"="+allMoney); return true; } /** * 存钱 */ public boolean addMoney(float money){ if(DateConstant.isEnd()){//结束了 logger.info("-------已结束!-------"); return false; } float sourceMoney = allMoney; allMoney = allMoney + money; logger.info(DateConstant.getNowDateForString()+"存钱:"+sourceMoney+"+"+money+"="+allMoney); return true; } }
package pc.d3; import java.util.Calendar; import java.util.HashSet; import java.util.Set; import org.apache.log4j.Logger; /** * 生产者---往银行账户加钱(主要来自工作的薪水、理财赚的钱) * 其中:1)薪水每月18000元 * 2)理财日收益率: 1/10000 (即1万元一天收益1元) * @author zhoufy */ public class Producer implements Runnable{ Logger logger = Logger.getLogger(Producer.class); /**发工资记录**/ private Set<String> recordPaySet = new HashSet<String>(); private String yearMonth = ""; /**利息结算记录**/ private Set<String> recordInterestSet = new HashSet<String>(); private String yearMonthDay = ""; /**银行账户**/ private Account account; /** * 构造子函数 */ public Producer(Account a){ account = a; } /** * 是否发工资时间(以每月的1号12点为准发工资) * @return */ public boolean isPayOffTime(){ Calendar calendar = Calendar.getInstance(); calendar.setTime(DateConstant.getNowDate()); //先判断是否本月已经发过工资 yearMonth = calendar.get(Calendar.YEAR) + "-" + calendar.get(Calendar.MONTH); if(recordPaySet.contains(yearMonth)){ return false; } //判断是否发工资时间 if(calendar.get(Calendar.DAY_OF_MONTH) == 1 && calendar.get(Calendar.HOUR_OF_DAY) == 12){ logger.info("-----------发工资时间: " + DateConstant.getNowDateForString()); return true; } return false; } /** * 是否利息结算时间(以每天的18点结算) * @return */ public boolean isInterestCountTime(){ Calendar calendar = Calendar.getInstance(); calendar.setTime(DateConstant.getNowDate()); //先判断是否今天已经结算过利息 yearMonthDay = calendar.get(Calendar.YEAR) + "-" + calendar.get(Calendar.MONTH) + calendar.get(Calendar.DAY_OF_MONTH); if(recordInterestSet.contains(yearMonthDay)){ return false; } //logger.info("--->"+calendar.get(Calendar.HOUR_OF_DAY)); //判断是否利息结算时间 if(calendar.get(Calendar.HOUR_OF_DAY) == 18){ //logger.info("利息结算时间: " + DateConstant.getNowDateForString()); return true; } return false; } @Override public void run() { while(!DateConstant.isEnd()){ //如果还没有结束 if(isPayOffTime()){ //如果到了发工资时间 if(account.addMoney(18000)){ recordPaySet.add(yearMonth); } } if(isInterestCountTime()){ //如果到了利息结算时间 if(account.addMoney((float)(account.getMoney()*0.0001))){ recordInterestSet.add(yearMonthDay); } } DateConstant.timeRun(); logger.error("当前时间:" + DateConstant.getNowDateForString()); } logger.info("账户共有:" + account.getMoney() + "元"); } }
package pc.d3; import java.util.Calendar; import java.util.HashSet; import java.util.Set; import org.apache.log4j.Logger; /** * 消费者---交房租、生活费等开销每个月5000元 * @author zhoufy */ public class Consumer implements Runnable{ Logger logger = Logger.getLogger(Consumer.class); /**交房租记录**/ private Set<String> recordChummageSet = new HashSet<String>(); private String yearMonth = ""; /**银行账户**/ private Account account; /**房租N月一交**/ private int splitMonth = 3; /**上一次交房租月份**/ private int lastPayMonth = 0; /** * 构造子函数 */ public Consumer(Account a){ account = a; } /** * 是否消费时间(以每月的1号12点为交房租) * @return */ public boolean isPayOffTime(){ Calendar calendar = Calendar.getInstance(); calendar.setTime(DateConstant.getNowDate()); if(lastPayMonth==0){ lastPayMonth = calendar.get(Calendar.MONTH) - splitMonth; } //先判断是否已经交过房租 yearMonth = calendar.get(Calendar.YEAR) + "-" + calendar.get(Calendar.MONTH); if(recordChummageSet.contains(yearMonth)){ return false; } //判断是否交房租时间 if(calendar.get(Calendar.MONTH)==(lastPayMonth+splitMonth) && calendar.get(Calendar.DAY_OF_MONTH) == 1 && calendar.get(Calendar.HOUR_OF_DAY) == 13){ logger.info("交房租时间: " + DateConstant.getNowDateForString()); lastPayMonth = calendar.get(Calendar.MONTH); return true; } return false; } @Override public void run() { while(!DateConstant.isEnd()){ //如果还没有结束 if(isPayOffTime()){ //如果到了交房租时间 if(account.subMoney(5000*splitMonth)){ //注意:这里是交房租金额=月房租数*一次性交的月数 recordChummageSet.add(yearMonth); } } } } }
package pc.d3; public class Main { public static void main(String[] args) { /**创建银行账户**/ Account account = new Account(); /**生产者**/ new Thread(new Producer(account)).start(); /**消费者**/ new Thread(new Consumer(account)).start(); } }
运行结果:
房租一个月一交,最后账户金额为:78841.414元
房租二个月一交,最后账户金额为:78795.43元
房租三个月一交,最后账户金额为:78747.89元
哎,看来还是一月一交省钱,可天下又有几个房东好心让租房者一个月一交房租呢!
我有一个梦想,愿有一天,中华儿女不再因租房而奔波劳碌!
说明:其中运行结果不是一次运行出来的,是分三次运行出来的,其中交房租方式是通过类Consumer.java中的splitMonth属性的值控制的。
相关推荐
1. **Java基础**:熟悉Java语法、面向对象编程、异常处理、多线程以及IO流等基本概念。 2. **金融业务逻辑**:理解理财产品的特性,如定期存款、基金投资、股票交易等的处理逻辑。 3. **数据库操作**:掌握JDBC或ORM...
8. **多线程**:如果系统支持后台任务,如定期同步银行账户数据,那么需要利用Java的多线程特性,以避免阻塞用户界面。 9. **软件测试**:为了保证系统的稳定性和准确性,开发者需进行单元测试、集成测试和系统测试...
4. **多线程**:Java的并发处理能力使得系统能同时处理多项任务,如后台数据计算和同步更新。 5. **异常处理**:Java的异常处理机制确保了程序在遇到错误时能够优雅地处理,提高系统的稳定性。 6. **网络编程**:...
开发者可能使用了Java的核心类库,如集合框架、I/O流和多线程等,来实现数据存储、文件操作和并发处理。 GUI(图形用户界面)是用户与应用交互的桥梁。在Java中,可以使用JavaFX或Swing库来构建GUI。JavaFX提供了...
6. **多线程**:可能用于实现后台计算或数据同步,不影响用户界面的响应性。 7. **报表和图表**:使用如**Crystal Reports**或自定义的逻辑生成收支报告,以图表形式展示财务状况,便于用户理解。 8. **版本控制**...
8. **多线程**:如果系统有后台计算或更新任务,可能用到Java的多线程特性,使得这些任务可以在不影响用户界面的情况下异步执行。 9. **单元测试**:为了确保系统的各个模块正常工作,开发者可能使用JUnit或其他...
此外,C#的多线程和异步处理能力也有助于处理大数据量和高并发场景,确保系统性能稳定。 理财管理信息系统的账户管理模块允许用户创建、修改和删除账户,同时管理不同账户之间的转账操作。投资分析模块则通过收集...
总的来说,利用C#开发个人理财系统是一项综合性的任务,涉及到面向对象编程、数据库设计、UI交互、数据安全等多个方面。通过合理的设计和实现,我们可以构建出一款功能强大、用户友好的个人理财工具,帮助用户更好地...
2. **.NET框架**:.NET框架为VB.NET提供运行环境,包括类库、编译器、垃圾回收机制等,支持跨语言的组件交互和多线程编程,是VB.NET开发的重要基础。 3. **SQL数据库**:SQL(Structured Query Language)是用于...
8. **异步处理与多线程**:为了保证界面流畅,后台任务如网络请求通常会在AsyncTask或IntentService中执行。 9. **通知与推送服务**:应用可能需要发送交易提醒,这就涉及到了Android的Notification API,甚至可能...
5. **多线程**:考虑到用户可能同时进行多个财务操作,如导出报告、更新数据,程序可能采用了多线程技术,使这些任务可以并发执行,提高用户体验。 6. **计算与分析**:工具可能包含预算规划、收支分析等功能,需要...
10. **多线程**:如果系统包含实时更新的组件,如股票价格,那么多线程编程可能是必要的,以避免阻塞主线程。 通过分析并实践这个"理财管理系统 c#示例项目",开发者不仅可以巩固C#编程技能,还能学习到如何构建一...
6. **多线程**:应用可能使用多线程来实现异步操作,比如后台数据同步或计算。 7. **IO流**:文件读写、数据导入导出可能涉及到Java的IO流操作。 8. **日期时间处理**:理财应用会涉及日期和时间的处理,Java 8的...
7. **并发与多线程**:为了处理大量并发请求,项目可能运用了Java的多线程技术,如ExecutorService,配合线程池进行任务调度,以提高服务器性能。 8. **异常处理**:良好的异常处理机制能确保系统稳定,提供友好的...
例如,系统可能使用Java集合框架来管理用户的账户信息,使用IO流进行数据读写,以及使用多线程来提高程序性能。 个人理财系统的核心功能通常包括: 1. **账户管理**:用户可以创建、编辑和删除自己的银行账户,...
此外,C#的多线程处理能力可以确保音乐播放与用户界面操作的流畅性。 这三个项目均在C#环境中开发,充分展现了C#语言在用户界面设计、数据处理和多媒体应用方面的强大性能。作者通过这些作品,不仅锻炼了自己的编程...
它具有高效、安全、类型强、语法简洁等特点,支持多线程、网络通信、数据库连接等功能,非常适合构建复杂的桌面和Web应用程序。在个人理财管理系统中,C#提供了良好的编程环境和丰富的类库,使得开发过程更为便捷。 ...
6. **多线程和并发**:如果软件支持后台运算或实时更新,可能会涉及到多线程编程,理解线程同步和通信机制是必要的。 7. **本地化与国际化**:对于一款面向广大用户的软件,可能包含本地化和国际化功能,可以学习...
在开发个人理财系统时,Java提供了丰富的类库和API,如集合框架、IO流、多线程等,用于处理数据存储、文件操作和并发处理等任务。 二、MVC设计模式 个人理财系统通常采用MVC(Model-View-Controller)设计模式。...
- **多线程**:处理后台任务,如数据备份,不影响用户界面的响应速度。 - **异常处理**:确保程序在遇到错误时能优雅地处理,避免崩溃。 开发过程中,遵循良好的软件工程实践,如模块化设计、代码审查和测试,以...