⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bankdemo.java

📁 java编写的一个多线程程序
💻 JAVA
字号:
import java.io.*;
import java.util.List;
import java.util.Random;
import java.util.LinkedList;
import java.util.Collections;
import java.util.Iterator;
import java.sql.*;
import java.lang.*;

public class BankDemo
{
    public static int numberOfCounter=10;//假定柜台数
    public static int numberOfPeople=1000;//假定用户数
    
    public static int addUserScope=200;	
    public List  AccountList;//银行账户链表
    public List CounterList[]=new List[numberOfCounter];//队列链表;这里以后改为10
	
    public BankCounterThread threadNum[]=new BankCounterThread[numberOfCounter];//每个柜台处理线程;这里以后改为10
    public CreateUserThread createThread;//产生随机用户线程
    public Object obj;
    public BankDemo()
    {
    	obj=new Object();
    }	    
    public static void main(String args[])
    {
	   BankDemo bank=new BankDemo();
	   bank.InitialList();
	   bank.InitialThread();
	   synchronized(bank.obj)
	   {
           try
           {
	          (bank.obj).wait();
	       }
	       catch(InterruptedException e)
	       {
	       }
	   }
	   try
	   {
	       Thread.sleep(30000);
	   }
	   catch(InterruptedException e)
	   {
	   }
	   bank.TerminateThread();
	   System.out.println("********************"+"\n"+"银行处理完毕!"+"\n"+"********************");
    }
    
    protected void TerminateThread()
    {
    	for(int i=0;i<numberOfCounter;i++)
    	{
    	    threadNum[i].stop();
    	}
    }
    
    protected void InitialList()
    {
       AccountList =Collections.synchronizedList(new LinkedList());
       for(int j=0;j<numberOfCounter;j++)//这里以后改为10
       {
          CounterList[j]=Collections.synchronizedList(new LinkedList());
       }
    }
   
    protected void InitialThread()
    { 					
	   for(int i=0;i<numberOfCounter;i++)//这里以后改为10
	   {
	       threadNum[i]=new BankCounterThread("柜台"+Integer.toString(i)+"营业线程启动!",i,this);
	       threadNum[i].start();
	   }		
       CreateUserThread createThread=new CreateUserThread("创建用户线程启动!",this);
       createThread.start();
    } 	   
}

class CreateUserThread extends Thread
{
    Random rand;
    int userID=0;
    int operateState=0;//0:存;1:取
    int amountOfMoney=0;
    BankDemo bankInCreate;
    public CreateUserThread(String userName,BankDemo bankInCreate)
    {
    	super(userName);
    	System.out.println(userName);
        this.bankInCreate=bankInCreate;
        rand=new Random();
    }
    public void run()
    { 	 
        Iterator iter;
        UserRandomClass newUser;
        UserRandomClass tempRamUser;
        boolean RemFlag=false;//false:没有相同用户;true:有相同用户
        
        int lengthLine[]=new int[bankInCreate.numberOfCounter];//各个柜台的长度,此处以后改为10个0
        for(int n=0;n<bankInCreate.numberOfCounter;n++)
        {
        	lengthLine[n]=0;
        }
        
        int minLength=0;//最少人数
        int numOfLine=0;//第几个柜台前人数最少
        for(int i=0;i<bankInCreate.numberOfPeople;i++)//以后这里改为1000
        {
            newUser=new UserRandomClass();
            newUser.SetUserID(10000+rand.nextInt(bankInCreate.addUserScope));
            newUser.SetOperateState(rand.nextInt(2));
            newUser.SetAmountOfMon(2000+rand.nextInt(3000));
            RemFlag=false;
//查询有无相同用户
            for(int j=0;j<bankInCreate.numberOfCounter;j++)//此处以后改为10
            {
        	   synchronized(bankInCreate.CounterList[j]) 
        	   {
        	       lengthLine[j]=bankInCreate.CounterList[j].size();
                   iter=bankInCreate.CounterList[j].iterator();
                   while(iter.hasNext())
                   {
            	      tempRamUser=(UserRandomClass)iter.next();
            	      if(newUser.GetUserID()==tempRamUser.GetUserID())
            	      {
            	    	  RemFlag=true;
            	    	  break;
            	      }
                    }                
                }
                if(RemFlag)
                {
                   break;
                }
            }
//比较队列长度
            if(!RemFlag)
            {
            	minLength=lengthLine[0];
            	numOfLine=0;
            	for(int m=0;m<bankInCreate.numberOfCounter;m++)//此处以后改为10
            	{
            		if(minLength>lengthLine[m])
            		{
            			minLength=lengthLine[m];
            		    numOfLine=m;
            		}
            	}
            	synchronized(bankInCreate.CounterList[numOfLine])
            	{
            		bankInCreate.CounterList[numOfLine].add(newUser);
            	}           	
            }
            else 
            {
            	i-=1;
            }
        }//for用户产生完成
        synchronized(bankInCreate.obj)
        {
            bankInCreate.obj.notify();
        } 
    }//run  
}

class BankCounterThread extends Thread
{
	private Random randTime;
    int counterNum;
    BankDemo bankInCounter;
	public BankCounterThread(String SeviceNumber,int counterNum,BankDemo bankInCounter)
	{
	     super(SeviceNumber);
	     this.counterNum=counterNum;
	     this.bankInCounter=bankInCounter;
	     System.out.println(SeviceNumber);
         randTime=new Random();
	}
	public void run()
	{
	   UserRandomClass  firstUserAccount;
	   Iterator iter;
	   int userID=0;
	   int amountOfMoney=0;
	   int operateState=0;
	   BankAccountClass accountOfBank;		
	   boolean accountAddFlag=false;//false表示储户为新储户,true表示储户已存在
		
	   BankAccountClass addAccountClass;
	   while(true)
	   {
//从队列中取出第一个用户信息
		  synchronized(bankInCounter.CounterList[counterNum])
		  {
		      iter=bankInCounter.CounterList[counterNum].iterator();
		      if(iter.hasNext())
		      {
			      firstUserAccount=(UserRandomClass)iter.next();
			      userID=firstUserAccount.GetUserID();
			      amountOfMoney=firstUserAccount.GetAmountOfMon();
			      operateState=firstUserAccount.GetOperateState();
    		      iter.remove();//已取得用户信息,从队列中删除		 	
    		  }
    		  else //队列无用户等待10微秒
    		  { 
			      try
			      {
			          sleep(10);
                  }
                  catch(InterruptedException e)
                  {
                  }
    		      continue;
    	      }			 	
		   }
//银行处理业务延迟5微秒		 
		  try
		  {
		    sleep(50+randTime.nextInt(450));
          }
          catch(InterruptedException e)
          {
          }
//对比银行储户信息
		  synchronized(bankInCounter.AccountList)
		  {
		     iter=bankInCounter.AccountList.iterator();
		     while(iter.hasNext())
		     {
			    accountOfBank=(BankAccountClass)iter.next();
			    if(accountOfBank.GetUserID()==userID)
			    {			 			
			        accountAddFlag=true;
			        if(operateState==0)//存钱
			        {
			 	        accountOfBank.SetAmountOfMon(accountOfBank.GetAmountOfMon()+amountOfMoney);
			 	        accountOfBank.SetOperateTime(GetSystemTime());
			 	        System.out.println("用户"+userID+"于"+accountOfBank.GetOperateTime()+"在"+(counterNum+1)+"号柜台"+"存款"+amountOfMoney);
			        }
			        else if(amountOfMoney<=accountOfBank.GetAmountOfMon())//账户余额足够支取
			        {
			 	        accountOfBank.SetAmountOfMon(accountOfBank.GetAmountOfMon()-amountOfMoney);
			 	        accountOfBank.SetOperateTime(GetSystemTime());
			 	        System.out.println("用户"+userID+"于"+accountOfBank.GetOperateTime()+"在"+(counterNum+1)+"号柜台"+"取款"+amountOfMoney);
			        }
			        else
			 	    System.out.println("用户"+userID+"账户余额不够支取!");
			 	                    			      
			        break;
			    }			 		
		     }
		     if(!accountAddFlag)
		     {
			    if(operateState==0)//帐户不存在,新建帐户
			    {
			        addAccountClass=new BankAccountClass();
			        addAccountClass.SetUserID(userID);
			        addAccountClass.SetAmountOfMon(amountOfMoney);
			        addAccountClass.SetOperateTime(GetSystemTime());
                    bankInCounter.AccountList.add(addAccountClass);
                    System.out.println("用户"+userID+"于"+addAccountClass.GetOperateTime()+"在"+(counterNum+1)+"号柜台"+"存款"+amountOfMoney);
                }
                else
                    System.out.println("对不起,账户"+userID+"不存在!不能取款!");
		     }
		    accountAddFlag=false;
		 }//synchronized	
	   }//while
    }//run
	
	protected String GetSystemTime()
	{		
        Timestamp ts=new Timestamp(System.currentTimeMillis()); 
        String dateStr1=ts.toString();
        return dateStr1;
	}	    
}

class BankAccountClass//账户内容
{
    private int userID=0;
    private int amountOfMoney=0;
    private String operateTime="";	
    public BankAccountClass()
    {    	
    }
    protected int GetUserID()
    {
    	return userID;
    }
    protected void SetUserID(int user)
    {
    	userID=user;
    }
    protected int GetAmountOfMon()
    {
    	return amountOfMoney;
    }
    protected void SetAmountOfMon(int money)
    {
    	amountOfMoney=money;
    }
    protected String GetOperateTime()
    {
    	return operateTime;
    }
    protected void SetOperateTime(String time)
    {
    	operateTime=time;
    }
}

class UserRandomClass
{
    private int userID=0;
    private int operateState=0;//0:存;1:取
    private int amountOfMoney=0;
    public UserRandomClass()
    {	
    }
    protected int GetUserID()
    {
    	return userID;
    }
    protected void SetUserID(int user)
    {
    	userID=user;
    }
    protected int GetOperateState()
    {
    	return operateState;
    }
    protected void SetOperateState(int operate)
    {
    	operateState=operate;
    }
    protected int GetAmountOfMon()
    {
    	return amountOfMoney;
    }
    protected void SetAmountOfMon(int money)
    {
    	amountOfMoney=money;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -