本人对于线程知识不是特别了解,以下内容只是个人在实际开发中一些感悟,若有不足之处,希望能帮忙指正。

对于线程的使用,若是有大量的开销情况下,不妨可以使用线程池,有效的控制开销,能使效率达到最优,从而提高效率。

线程池可能有很多的实现类,但本文只对: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();
        }