最近做了一个项目使用多线程非常频繁,总结一下使用遇到的问题和解决办法
1、当然是线程要用线程池管理,这样会使资源分配合理,比如我在项目中用多线程读取文件,a、有可能使有些文件已经读取快结束了,而有些文件还没开始读取;b、批量处理文件时,如果没有使用线程池,就可能使cpu使用率为100%,机器基本什么都不能干了,而且执行效率并不一定比线程管理下的线程执行效率高。
2、多线程使用的资源尽量不使用公共资源,可以用局部变量代替,公共资源很容易引起死锁或者,管理不当使得结果错误,局部变量就不会有这种情况,当内存不够用时,Java内存管理器会把无用的内存释放,所以我们不用担心创建对象过多,当然,如果必须用为公用资源的话,也要公用资源。
3、Timer定时管理器和ScheduledFutured线程池的区别
a、Timer是单线程执行,任务时串行执行,ScheduledFutured是多线程执行任务;
b、Timer可以通过task.canel()方法取消任务,ScheduledFutured需要通过获取线程执行的结果ScheduledFuture<?>类来取消任务执行;
c、Timer执行任务超时,下次执行任务会把时间赶回来,就是执行时间不会有偏差,但是ScheduledFutured执行任务如果有上次任务没有执行完,下次就会推迟执行,以至于以后每个周期都会向后推迟。
4、多线程中执行关于时间的处理,
a、如果使用Timer的话,最好在刚执行的时候就记录下时间,如果调用其他函数,则把时间传进去,这样时间比较精确不会有偏差;
b、如果使用ScheduledFutured执行周期任务的话,最后把周期的时间先生成,任务类依次读取,否则很可能造成时间差;
c、总之,如果时间最好不要在用的时候才去获取,要先获取时间传给需要使用的方法;