问题描述
首先 吾辈先声明下 吾辈是菜菜, 所以大湿们觉得的那里说错了 尽量喷~~今天早上 吾辈蛋疼的看了下 Excutors 的源代码, 又看了下以前用到线程池的一些方法, 发现了一个小问题吾辈一直是先弄出个线程池, 然后玩命的在线程池里面死命的塞对象ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);pool.submit(new xRunnable()); : :pool.shutdown();while (true) {if(pool.isTerminated())break;TimeUnit.SECONDS.sleep(2);}线程池的主要目的是减少线程创建与销毁的时间吧? && 资源的创建与销毁然后吾辈又想了 new xRunnable() 的时候 应该会创建很多资源吧 比如很多Map啊, 一些Bo啊 什么的?(为了线程安全 很多资源 咱都是 new 出来了 吾辈又不怎么热衷于同步的方法, 总是感觉 线程一多, 同步会大大的影响效率)问题1: 各位大湿是怎么处理线程安全的啊??吾辈想了: 那些对象什么的 用完后没有必要被销毁掉, 重新初始化下 应该能继续用吧. 然后咱就这样想了: 把那些xRunnable要用到的资源封装成一个对象, (就叫其"资源库"吧) 然后创建一个与线程大小相同的资源库数组, 当要运行xRunnable时候 将其注入到 xRunnable 对象中. 而需要拿到那个资源库, 根据线程ID 应该可以判断吧, 反正线程结束 资源库的使命也完成了.问题2: 各位大湿吾辈这样的想法有问题么??可以能吾辈比较纠结吧 所以没事的时候会钻牛角尖~~问题3: 咱找了好久, 但是没发现Java的线程池是否可以重写下run的时候的方法问题补充NanguoCoffee 写道
解决方案
这个, 你的资源库要是能 放取自如 一切就ok了. 问题就会卡在这吧.. 你可以试试. 我以前觉得访问对象 总是new 也慢 也想过 我叫 对象池 不过没实现
解决方案二:
嘿嘿,俺发现很多人一提到多线程就要用到线程同步,这样还不如不用多线程,直接用个队列+单线程来处理数据,这样还快些。多线程的话,需要清楚的知道自己的程序各个线程之间是否会有共享变量同时访问的情况,如果有就得同步一下,如果没有就别用同步浪费性能了。JVM的内存模型分为线程空间和主存空间。当你启动一个线程的时候,jvm会把主存空间里面的数据copy到线程空间里面去,就是那些共享变量啦(线程运行时需要的外部数据,这样来说贴切些)。这个时候jvm里面就会有2份数据的copy。主存空间里面的数据是对所有线程可见的。而线程空间的数据只对他自己的线程可见。当线程运行完以后又会把线程空间里面的数据copy到主存空间去,同时销毁线程空间里面的所有数据。这样解释以后你就清楚多线程到底危险在什么地方了,呵呵。
解决方案三:
你又没同步干吗担心同步会效率慢不过多多思考问题对自己会有好处的。做之前就能意识到问题的是架构师做完之后能发现问题的叫高级程序员做完之后还不能意识到问题的就只能做一辈子的程序员鸟
解决方案四:
1: 要啥资源库呀。 要么重新new一个,要么复用已有的2: 真够钻牛角尖3: 没事你修改run的方法干嘛? 要修改就自己写个线程池得了