多线程使用的主要目的在于:
1、吞吐量:你做WEB容器帮你做了多线程,但是他只能帮你做请求层面的简单的说,可能就是一个请求一个线程或多个请求一个线程。如果是单线程那同时只能处理一个用户的请求。
2、伸缩性:也就是说你可以通过增加CPU核数来提升性能。如果是单线程那程序执行到死吔就利用了单核,肯定没办法通过增加CPU核数来提升性能
鉴于你是做WEB的,第1点可能你几乎不涉及那这里我就讲第二点吧。
所以多线程不是没怎么用而是,你平常要善于发现一些可优化的点然后评估方案是否应该使用。
那么现在优化的点就不是第一个例子那样的任务分割多线程完成。而是优化文件3的读取速度
看起来好像还不错,建立一个文件名和文件数据的映射如果读取一个map中已经存在的数据,那麼就不不用读取文件了
可是问题在于,Servlet是并发上面会导致一个很严重的问题,死循环因为,HashMap在并发修改的时候可能是导致循环链表的构成!!!(具体你可以自行阅读HashMap源码)如果你没接触过多线程,可能到时候发现服务器没请求也巨卡也不知道什么情况!
好的,那就用ConcurrentHashMap正如他的名字一样,他是一个线程安全的HashMap这样能轻松解决问题。
这样真的解决问题了吗这样虽然只要有用户访问过文件a,那叧一个用户想访问文件a也会从fileName2Data中拿数据,然后也不会引起死循环
可是,如果你觉得这样就已经完了那你把多线程也想的太简单了,騷年!
难道代码错了吗难道我就这样过我的一生!
好好分析下。Servlet是多线程的那么
上面注释的“偶然”,这是完全有可能的因此,这樣做还是有问题
因此,可以自己简单的封装一个任务来处理
以上所有代码都是直接在bbs打出来的,不保证可以直接运行
多线程最多的場景:web服务器本身;各种专用服务器(如游戏服务器);
多线程的常见应用场景:1、后台任务,例如:定时向大量(100w以上)的用户发送邮件;2、异步处理例如:发微博、记录日志等;3、分布式计算