本人对于线程知识不是特别了解,以下内容只是个人在实际开发中一些感悟,若有不足之处,希望能帮忙指正。
对于线程的使用,若是有大量的开销情况下,不妨可以使用线程池,有效的控制开销,能使效率达到最优,从而提高效率。
线程池可能有很多的实现类,但本文只对:java.util.concurrent包下的ThreadPoolExecutor类进行简单的说明。
我们可以创建一个ThreadPoolExecutor实例,然后不断地给实例中的任务队列放入具体任务,并执行,还可以等所有任务后获取对应的结果,代码如下:
//创建线程池
/*参数说明:
*第一个参数:线程池初始化时,会创建10个线程
*第二个参数:若线程不够用时,线程池中的线程会最大增加到15个,若线程闲置时,会回收至10个
*第三个参数:结合第四个参数,60为量,TimeUnit.SECONDS时间单位(秒),估计可以用分或钟,而作用为当超过时间(60S)后,闲置的线程将被回收至10个
*第四个参数:如上述
*第五个参数:任务队列,用于存放具体业务功能的任务集
*/
ThreadPoolExecutor threadPool= new ThreadPoolExecutor(10, 15, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
//这里放入50个任务
for(int i=0;i<50;i++){
Runnable task = new Runnable() {
@Override
public void run() {
//为了操作数据安全,这里要放置obj锁对象
synchronized (obj) {
//写具体业务逻辑,obj可以是对应业务逻辑的vo对象,并在同步块中操作该vo对象
}
}
};
//当所有的任务被放入队列时,线程池才将线程开启,并run对应的任务
threadPool.execute(task);
}
//这里是不再增加新任务,等待执行的任务不受影响
threadPool.shutdown();
//因为主线程不会等待线程池中线程的原因,所以若是主线程需要线程池返回的结果的话,这里可以调用awaitTermination接口,让主线程等待线程池中任务执行完毕后再执行
try {
boolean loop = true;
do {//等待所有任务完成
loop = !threadPool.awaitTermination(2, TimeUnit.SECONDS); //阻塞,直到线程池里所有任务结束
} while(loop);
} catch (InterruptedException e) {
e.printStackTrace();
}