|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你希望java的IDE整合。这个是没有必要的,重要的是你理解java有多深以及怎么组织你的代码,即使没有IDE,代码照样能够编译运行的。
这个故事源自一个很复杂的设法:创立一个对开辟职员友爱的、复杂轻量的线程间通信框架,完整不用锁、同步器、旌旗灯号量、守候和关照,在Java里开辟一个轻量、无锁的线程内通信框架;而且也没有行列、动静、事务或任何其他并发公用的术语或工具。
只用一般的老式Java接话柄现POJO的通信。
它大概跟Akka的范例化actor相似,但作为一个必需超等轻量,而且要针对单台多核盘算机举行优化的新框架,谁人大概有点过了。
当actor超过分歧JVM实例(在统一台呆板上,或散布在收集上的分歧呆板上)的历程界限时,Akka框架很擅长处置历程间的通信。
但关于那种只必要线程间通信的小型项目而言,用Akka范例化actor大概有点儿像用牛刀杀鸡,不外类型化actor仍旧是一种幻想的完成体例。
我花了几地利间,用静态代办署理,堵塞行列弛缓存线程池创立了一个办理计划。
图一是这个框架的高条理架构:
图一:框架的高条理架构
SPSC行列是指单平生产者/单一消耗者行列。MPSC行列是指多临盆者/单一消耗者行列。
派发线程卖力吸收Actor线程发送的动静,并把它们派发到对应的SPSC行列中往。
吸收到动静的Actor线程用个中的数据挪用响应的actor实例中的办法。借助其他actor的代办署理,actor实例能够将动静发送到MPSC行列中,然后动静会被发送给方针actor线程。
我创立了一个复杂的例子来测试,就是上面这个打乒乓球的程序:- publicinterfacePlayerA(
- voidpong(longball);//发完就忘的办法挪用
- }
- publicinterfacePlayerB{
- voidping(PlayerAplayerA,longball);//发完就忘的办法挪用
- }
- publicclassPlayerAImplimplementsPlayerA{
- @Override
- publicvoidpong(longball){
- }
- }
- publicclassPlayerBImplimplementsPlayerB{
- @Override
- publicvoidping(PlayerAplayerA,longball){
- playerA.pong(ball);
- }
- }
- publicclassPingPongExample{
- publicvoidtestPingPong(){
- //办理器埋没了线程间通信的庞大性
- //把持actor代办署理,actor完成和线程
- ActorManagermanager=newActorManager();
- //在办理器内注册actor完成
- manager.registerImpl(PlayerAImpl.class);
- manager.registerImpl(PlayerBImpl.class);
- //创立actor代办署理。代办署理会将办法挪用转换成外部动静。
- //会在线程间发给特定的actor实例。
- PlayerAplayerA=manager.createActor(PlayerA.class);
- PlayerBplayerB=manager.createActor(PlayerB.class);
- for(inti=0;i<1000000;i++){
- playerB.ping(playerA,i);
- }
- }
复制代码 <p>
你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。 |
|