最近由于公司的业务需求,需要使用线程池来进行对数据进行处理,所以就简单的学习了一下线程池的东西,刚接触感觉挺难的,不过使用了就不感觉那么难了,还是蛮简单的,
package com.yd.sms.job; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.axis.components.threadpool.ThreadPool; import org.hibernate.mapping.Array; import com.yd.sms.api.local.SmsRunLocal; import com.yd.sms.bean.entity.ActStatList; import com.yd.sms.bean.local.ActStatListFacadeLocal; import com.yd.sms.common.EJBHomeFactory; /** * * @author allen.tang * */ public class SmsCleanJob { private final static ExecutorService threadPool; //线程池 private static int maxThread; //需要启动的最大线程数 private static int maxSingletonThread; //单个线程执行的任务数量 static{ ResourceBundle bundle = PropertyResourceBundle.getBundle("config"); //获取配置文件信息 String maxThread_str = bundle.getString("threadPool_maxThread"); String maxSingletonThread_str = bundle.getString("threadPool_maxSingletonThread"); maxThread = Integer.valueOf(maxThread_str); maxSingletonThread = Integer.valueOf(maxSingletonThread_str); threadPool = Executors.newFixedThreadPool(maxThread); } /** * 执行 */ public void execute(){ long startTime = System.currentTimeMillis(); String[] names = new String[]{"a", "b", "c", "d", "e"}; System.out.println("********开始进入线程池"); for(int i = 0; i < names.length; i ++){ threadPool.submit(new SmsCleanThread(names[i])); } long endTime = System.currentTimeMillis(); //由于公司的业务要求每个几秒就会有一批数据进来,所以这里在后面没有关闭线程池 System.out.println("********已经退出线程池:总共耗时:"+((endTime - startTime)/ 1000.0)+"秒"); System.out.println("========线程池已经执行结束!"); } /** * 线程 * @author allen.tang * */ class SmsCleanThread implements Runnable{ private String str; public SmsCleanThread(String str){ this.str = str; } public void run() { System.out.print(str+"执行中。。。"); } } } }
我这里所使用的是已经被封装好的线程池,所以挺简单的,不过这个也是用的最多的一个,在一开始的时候启动确定数量的线程,方便调用。