前言
该模块是在认认真真理解并动手完成马士兵老师代理模式的情景下完成,目前实现方法和旧版本一样
简单分析
这里遇到一个问题,如何高效率执行并发在线编程?
这个最终的解决办法并不是很好,但是探索的过程总是充满乐趣
- 怎么才能实现在线编程?
刚开始用记事本写java的时候,对这个问题肯定贼深刻,但随着工具的方便性,很多底层的东西越来越变得不透明。
其具体思路就是代码变成字符串,然后拿到当前编译器进行编译,最后将编译的结果输出即可。
但是如果不加以控制的话,最后如果并发量大的话,同时写入和读出造成错误,会使编译效率很低
2.如何保证编译并行执行?
由于个人经验和能力问题,这个问题最终没有本解决。但是探索的过程是很有趣的。
记得当时首先使用lock写锁,控制。假设是单线程执行,一个用户写完还必须按照时间等待,并发量高效率很低。很自然想到线程池,封装一个线程池工具类,创建一个编译线程任务类,然后就是按照线程创建时间创建不同的文件夹,每个文件夹来自不同的用户线程,这样就解决了记录问题,剩下就是怎么保证每个用户都知道自己执行哪个编译线程,然后拿到对应的编译结果(在这里遇到了瓶颈)
最终是可以并行执行编译,而不是串行等待,但是编译的结果随机发给了等待的用户,当然可以直接用synchronized控制同步,但是代价和执行效果就不怎么好了。
3.低效的解决办法
最后直接用synchronized控制同步,也就没有必要使用线程池了,只要保证不同用户编译和返回的结果是正确就行了
旧版本将该功能做成微服务,利用dubbo管理,这样尽可能降低并发带来的性能问题
码上有戏
|
|