用java编写多线程银行ATM 模拟程序

用java编写多线程银行ATM 模拟程序,第1张

先构建一个客户端,再构建一个服务器端,其实做一个简单的界面,建立一个数据库,调用SQl 语句,,实现单机,模拟多线程的就可以了,服务器部分不做也可以模拟出来。。
PS:这不会是程序专题训练一吧。。。

异常处理,尤其是socket异常处理更加重要,因为与你连接的那一头不会得到你发生错误的通知。
然后两个都是多线程,就都要注意线程共享资源锁的管理。最好对每个资源只有一个synchronized的可写对象,每个 *** 作这个资源的都要通过这个对象来 *** 作,这样不容易忘记,效率也比较好。
socket还要注意,一个客户可能双开来连接服务器,这个时候服务器是允许还是拒绝要想清楚。
多线程要注意的是,如果可以不用多线程,最好不要使用多线程。通常需要多线程的地方有:消息循环、Socket的服务器监听程序和其他需要死循环的地方。
在需要死循环的地方经常会用到多线程。既然是死循环,那么这个线程就要注意优先级,以前做过一个星际争霸的小外挂,没有设置优先级的时候导致玩星际争霸的时候会非常慢,把优先级减1设置为-1(C++,也就是比正常低),就正常了。
在服务器中也需要注意监听程序的优先级,一般都应该是降低一些吧。
另外socket还要注意安全,牵扯到网络的最好每一步都有每一步的安全措施。传输的是密码就要加密。
如果做挂接式的程序,那么无论是多线程还是socket都要注意尽量不破坏这个进程的原有数据。

在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。
在计算机编程中,一个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下手头的工作,改为处理其他一些问题,再返回主进程。可以通过多种途径达到这个目的。最开始的时候,那些掌握机器低级语言的程序员编写一些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。尽管这是一种有用的方法,但编出的程序很难移植,由此造成了另一类的代价高昂问题。中断对那些实时性很强的任务来说是很有必要的。但对于其他许多问题,只要求将问题划分进入独立运行的程序片断中,使整个程序能更迅速地响应用户的请求。
最开始,线程只是用于分配单个处理器的处理时间的一种工具。但假如 *** 作系统本身支持多个处理器,那么每个线程都可分配给一个不同的处理器,真正进入“并行运算”状态。从程序设计语言的角度看,多线程 *** 作最有价值的特性之一就是程序员不必关心到底使用了多少个处理器。程序在逻辑意义上被分割为数个线程;假如机器本身安装了多个处理器,那么程序会运行得更快,毋需作出任何特殊的调校。根据前面的论述,大家可能感觉线程处理非常简单。但必须注意一个问题:共享资源!如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到一个问题。举个例子来说,两个线程不能将信息同时发送给一台打印机。为解决这个问题,对那些可共享的资源来说(比如打印机),它们在使用期间必须进入锁定状态。所以一个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使用同样的资源。
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。

多有多个 CPU 可用。单核机器上多线程的优势不明显。
线程间有共享数据。如果没有共享数据,用模型 3b 就行。虽然我们应该把线程间的共享数据降到最低,但不代表没有;
共享的数据是可以修改的,而不是静态的常量表。如果数据不能修改,那么可以在进程间用 shared memory,模式 3 就能胜任。
提供非均质的服务。即,事件的响应有优先级差异,我们可以用专门的线程来处理优先级高的事件。防止优先级反转。

是的。
很多服务器端程序都是允许被多个应用程序访问的,例如门户网站可以被多个用户同时访问,因此服务器都是多线程的。
主线程用于监听套接字,有新的连接建立之后创建一个副线程,主线程继续监听。

用C#实现多线程TCP协议的服务器端程序:
// <summary>
/// Tcp客户线程类(服务端),ThreadServerProcessor 线程产生的客户连接,用该线程读写
/// </summary>
public class ThreadClientProcessor
{
//Tcp连接实例
private TcpClient tcpClient;
//消息框,本来想写日志用
private SystemWindowsFormsListBox MessageList;
private string Password; //该连接登陆密码
private string Cmd1Echo;
private string Cmd2Echo;
private bool ClientLogOn;//客户是否登陆
private bool TcpClose;
public ThreadClientProcessor(){}
//构造函数,参数解释:Tcp客户,消息框,该服务密码(password命令后的参数) ,命令回应串 1,2
public ThreadClientProcessor(TcpClient client , ListBox listBox,string LogonText ,string cmd1echo,string cmd2echo)
{
ClientListAdd(this); //把当前实例加入一个列表中,方便以后控制
thistcpClient=client;
thisMessageList=listBox;
thisPassword=LogonText;
thisCmd1Echo=cmd1echo;
thisCmd2Echo=cmd2echo;
thisClientLogOn=false;
thisTcpClose=false;
}
public static char[] CmdSplit={' '}; //读来的串由' ' 进行分离,命名+' '+参数
//public const string[] Cmd=new string[] { "password","cmd1","cmd2","echo","bye"};
//该函数由你自己写,这个只是给一个例子,
//功能:命令处理器,给个命令串,返回该命令处理结果,把命令和处理结果放在一个文本文件里,便于系统升级
public string TcpCmd(string s)
{
string result;
try
{
string cmdarg=sTrim();
string[] args=cmdargSplit(CmdSplit);
string cmd=args[0]ToLower();
switch (cmd )
{
case "password" :
if (argsLength>1)
{
ClientLogOn= PasswordEquals(args[1]Trim());
result=ClientLogOn "登陆成功":"密码不正确,未登陆";
}
else result= "登陆时候,没有输入密码";
break;
case "cmd1":
result=ClientLogOnthisCmd1Echo:"该命令无权执行,请先登陆";
break;
case "cmd2":
result=ClientLogOnthisCmd2Echo:"该命令无权执行,请先登陆";
break;
case "echo":
result=stringFormat("服务器回应:\n {0}",s);
break;
case "bye":
thisTcpClose=true;
result="DisConnected";
break;
default:
result="不可识别的命令";
break;
}
}
catch
{
result="解析命令发生错误,你输入的是狗屁命令,TMD ^ ";
}
return result;
} //end cmd
//定义一个线程,该线程对应的函数是 void start()(不是Start())
//一下程序主要是 *** 作该线程
public SystemThreadingThread tcpClientThread;
//启动客户连接线程
public void Start()
{
tcpClientThread=new Thread(new ThreadStart(start));
tcpClientThreadPriority=ThreadPriorityBelowNormal;
tcpClientThreadStart();
}
//断开该当前实例连接,终止线程
public void Abort()
{
if (thistcpClientThread!=null)
{
//tcpClientThreadInterrupt();
tcpClientThreadAbort();
//一定要等一会儿,以为后边tcpClientClose()时候,会影响NetWorkStream的 *** 作
ThreadSleep(TimeSpanFromMilliseconds(100));
tcpClientClose();
}
}
//静态列表,包含了每个连接实例(在构造实例时候使用了 ArrayListAdd( object))
private static SystemCollectionsArrayList ClientList=new ArrayList();
//断开所有的Tcp客户连接,静态方法
public static void AbortAllClient()
{
for(int j=0 ;j< ClientListCount;j++)
{
//从实例列表中取一个对象,转化为ThreadClientProcessor对象
ThreadClientProcessor o=(ThreadClientProcessor ) ClientList[j];
//调用ThreadClientProcessor 对象的停止方法
oAbort();
}
//清除连接列表
ClientListClear();
}
//读写连接的函数,用于线程//
private void start()
{
byte[] buf=new byte[10241024]; //预先定义1MB的缓冲
int Len=0; //流的实际长度
NetworkStream networkStream=tcpClientGetStream(); //建立读写Tcp的流
try
{
byte[] p=EncodingUTF8GetBytes(" 欢迎光临,请输入密码" );
//向Tcp连接写 欢迎消息
if (!thisClientLogOn )
networkStreamWrite(p,0,pLength);
//开始循环读写tcp流
while (!TcpClose)
{
//如果当前线程是在其它状态,(等待挂起,等待终止)就结束该循环
if (ThreadCurrentThreadThreadState!=ThreadStateRunning)
break;
//判断Tcp流是否有可读的东西
if ( networkStreamDataAvailable)
{
//从流中读取缓冲字节数组
Len=networkStreamRead(buf,0,bufLength);
//转化缓冲数组为串
string cmd=EncodingUTF8GetString(buf,0,Len);
thisMessageListItemsAdd("客户机:"+cmd);
//处理该缓冲的串(分析命令),分析结果为res串
string res=TcpCmd(cmd);
//把命令的返回结果res 转化为字节数组
byte[] result=EncodingUTF8GetBytes(res);
//发送结果缓冲数组给客户端
networkStreamWrite(result,0,resultLength);
thisMessageListItemsAdd("服务器回应:"+res);
}
else
{
//ThreadSleep(TimeSpanFromMilliseconds(200d));
//thisMessageListItemsAdd("客户机无命令");
//如果当前Tcp连接空闲,客户端没有写入,则当前线程停止200毫秒
ThreadSleep(TimeSpanFromMilliseconds(200d));
}
}

显卡的价格最近在一路暴涨,那么为什么一路暴涨,而且显卡还买不到呢,今天我们就来聊一聊,为什么显卡这么难买?

在现在的显卡市场上,一卡难求的情况普遍到处都是。一些高端的显卡根本就没有货,就算有货的话,你也需要加价购买。其实造成这个原因的是因为虚拟货币的暴增,还有矿潮的来临。现在几乎全球各地都在挖矿,以太坊算力已经达到410p了。大家都知道,虚拟货币就是要靠矿机获得的,而挖取虚拟货币的矿机组成最重要的部分就是显卡。

所以造成显卡涨价的主要原因就是因为虚拟货币的疯狂增长,特斯拉公司创始人马斯克购买了十几亿美元的比特币,而且还发公告称可以用比特币购买特斯拉,并且呼吁大家购买比特币和狗狗币,这也是比特币的价格涨到了57万美元一枚,而其他的虚拟货币受到比特币的影响,一路猛涨,比如以太币和罗门币等等。

这也导致了以太坊挖矿收益一路上升,达到了恐怖的每小时09元,由于新一代的显卡发货游戏性能大幅提升,3090显卡能够达到恐怖的120M算力。

而后因为全球半导体市场正在以前所未有的速度发展,但是收到新冠疫情的和新派需求激增的影响,去年下半年半导体行业面临着严重的供需失衡,这也导致了显卡的产能减少。

而本身显卡的出货量就不多,,显卡出货后,一出来就被挖矿的老板和黄油劫持分给经销商的更是又少,所以价格一度猛涨。

导致显卡价格猛涨,而且还一卡难求的情况,最主要的原因就是因为矿潮,导致黄牛抢货和矿老板加价购买显卡,从而供应商拿不到货,在一些电商平台高端的显卡更是少的可怜,每次抢购只有几张,而那些有货的显卡更是加价加到了18万甚至19万的天价。

其实原因就是因为产能导致不足,生产显卡的代工厂压力巨大而合作的各个大小厂商也开始打起了小伤害,把大量的显卡直接加价卖给了挖矿的老板,只把少部分的少量显卡留给了供应商,而且还被黄牛哄抢

其次因为全球疫情导致居家人数变多了,儿童在家用电子产品上网学习,大人也是用电子产品居家办公,导致家庭对显卡的需求也上涨,这也是其中的一小部分原因。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10499335.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存