`
周凡杨
  • 浏览: 234528 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多线程编程之理财

阅读更多

      现实生活中,我们一边工作,一边消费,正常情况下会把多余的钱存起来,比如存到余额宝,还可以多挣点钱,现在就有这个情况:我每月可以发工资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
2
分享到:
评论
2 楼 yubenjie 2015-07-16  
我怎么没看出多线程啊,就单线程再跑嘛
1 楼 fei229670104 2015-07-16  
多线程 不错

相关推荐

    java源码,轻松理财

    1. **Java基础**:熟悉Java语法、面向对象编程、异常处理、多线程以及IO流等基本概念。 2. **金融业务逻辑**:理解理财产品的特性,如定期存款、基金投资、股票交易等的处理逻辑。 3. **数据库操作**:掌握JDBC或ORM...

    java swing 家庭理财系统

    8. **多线程**:如果系统支持后台任务,如定期同步银行账户数据,那么需要利用Java的多线程特性,以避免阻塞用户界面。 9. **软件测试**:为了保证系统的稳定性和准确性,开发者需进行单元测试、集成测试和系统测试...

    家庭理财系统 java

    4. **多线程**:Java的并发处理能力使得系统能同时处理多项任务,如后台数据计算和同步更新。 5. **异常处理**:Java的异常处理机制确保了程序在遇到错误时能够优雅地处理,提高系统的稳定性。 6. **网络编程**:...

    Java课程设计--家庭理财系统带GUI界面.rar

    开发者可能使用了Java的核心类库,如集合框架、I/O流和多线程等,来实现数据存储、文件操作和并发处理。 GUI(图形用户界面)是用户与应用交互的桥梁。在Java中,可以使用JavaFX或Swing库来构建GUI。JavaFX提供了...

    家庭理财帮手C#.net

    6. **多线程**:可能用于实现后台计算或数据同步,不影响用户界面的响应性。 7. **报表和图表**:使用如**Crystal Reports**或自定义的逻辑生成收支报告,以图表形式展示财务状况,便于用户理解。 8. **版本控制**...

    家庭管理理财系统

    8. **多线程**:如果系统有后台计算或更新任务,可能用到Java的多线程特性,使得这些任务可以在不影响用户界面的情况下异步执行。 9. **单元测试**:为了确保系统的各个模块正常工作,开发者可能使用JUnit或其他...

    理财管理 信息系统

    此外,C#的多线程和异步处理能力也有助于处理大数据量和高并发场景,确保系统性能稳定。 理财管理信息系统的账户管理模块允许用户创建、修改和删除账户,同时管理不同账户之间的转账操作。投资分析模块则通过收集...

    C#完成的个人理财系统

    总的来说,利用C#开发个人理财系统是一项综合性的任务,涉及到面向对象编程、数据库设计、UI交互、数据安全等多个方面。通过合理的设计和实现,我们可以构建出一款功能强大、用户友好的个人理财工具,帮助用户更好地...

    家庭理财系统 VB.NET+SQL

    2. **.NET框架**:.NET框架为VB.NET提供运行环境,包括类库、编译器、垃圾回收机制等,支持跨语言的组件交互和多线程编程,是VB.NET开发的重要基础。 3. **SQL数据库**:SQL(Structured Query Language)是用于...

    Android理财通助手源码

    8. **异步处理与多线程**:为了保证界面流畅,后台任务如网络请求通常会在AsyncTask或IntentService中执行。 9. **通知与推送服务**:应用可能需要发送交易提醒,这就涉及到了Android的Notification API,甚至可能...

    家庭理财工具(java实现)

    5. **多线程**:考虑到用户可能同时进行多个财务操作,如导出报告、更新数据,程序可能采用了多线程技术,使这些任务可以并发执行,提高用户体验。 6. **计算与分析**:工具可能包含预算规划、收支分析等功能,需要...

    理财管理系统 c#示例项目

    10. **多线程**:如果系统包含实时更新的组件,如股票价格,那么多线程编程可能是必要的,以避免阻塞主线程。 通过分析并实践这个"理财管理系统 c#示例项目",开发者不仅可以巩固C#编程技能,还能学习到如何构建一...

    基于Java的理财小助手APP源码.zip

    6. **多线程**:应用可能使用多线程来实现异步操作,比如后台数据同步或计算。 7. **IO流**:文件读写、数据导入导出可能涉及到Java的IO流操作。 8. **日期时间处理**:理财应用会涉及日期和时间的处理,Java 8的...

    Java项目之理财软件后台服务(源码+接口+演示视频)

    7. **并发与多线程**:为了处理大量并发请求,项目可能运用了Java的多线程技术,如ExecutorService,配合线程池进行任务调度,以提高服务器性能。 8. **异常处理**:良好的异常处理机制能确保系统稳定,提供友好的...

    个人理财系统

    例如,系统可能使用Java集合框架来管理用户的账户信息,使用IO流进行数据读写,以及使用多线程来提高程序性能。 个人理财系统的核心功能通常包括: 1. **账户管理**:用户可以创建、编辑和删除自己的银行账户,...

    c# 大学生理财系统源代码及安装包+作者两外两个小程序(3D通讯录及仿千千静听音乐播放器)

    此外,C#的多线程处理能力可以确保音乐播放与用户界面操作的流畅性。 这三个项目均在C#环境中开发,充分展现了C#语言在用户界面设计、数据处理和多媒体应用方面的强大性能。作者通过这些作品,不仅锻炼了自己的编程...

    基于C#的一个个人理财管理系统

    它具有高效、安全、类型强、语法简洁等特点,支持多线程、网络通信、数据库连接等功能,非常适合构建复杂的桌面和Web应用程序。在个人理财管理系统中,C#提供了良好的编程环境和丰富的类库,使得开发过程更为便捷。 ...

    精典源码Delphi059:个人理财软件源码.rar

    6. **多线程和并发**:如果软件支持后台运算或实时更新,可能会涉及到多线程编程,理解线程同步和通信机制是必要的。 7. **本地化与国际化**:对于一款面向广大用户的软件,可能包含本地化和国际化功能,可以学习...

    92_java个人理财系统_理财管理软件_个人财务软件.zip

    在开发个人理财系统时,Java提供了丰富的类库和API,如集合框架、IO流、多线程等,用于处理数据存储、文件操作和并发处理等任务。 二、MVC设计模式 个人理财系统通常采用MVC(Model-View-Controller)设计模式。...

    家庭理财系统

    - **多线程**:处理后台任务,如数据备份,不影响用户界面的响应速度。 - **异常处理**:确保程序在遇到错误时能优雅地处理,避免崩溃。 开发过程中,遵循良好的软件工程实践,如模块化设计、代码审查和测试,以...

Global site tag (gtag.js) - Google Analytics