线程池用到的类在java.util.concurrent包下,核心类是Executors,通过其不同的几个方法可产生不同的线程池。
1.生成固定大小的线程池
public static ExecutorService newFixedThreadPool(int nThreads)
然后用ExecutorService对象的submit()方法来执行线程任务。
Future<?> submit(Runnable task);
<T> Future<T> submit(Runnable task, T result);
<T> Future<T> submit(Callable<T> task);
submit()方法有3个重载:
如果传入的参数是一个Runnable实例,则线程池将会在有空闲线程的时候执行此Runnable对象代表的任务(执行run()方法),Future对象代表run()方法的返回值,因为run()方法没有返回值,所以此时Future对象是null。
如果传入的参数是一个Runnable实例和某个类型的对象,则线程池将会在有空闲线程的时候执行此Runnable对象代表的任务(执行run()方法),Future对象
如果线程任务数大于线程池大小的话,则多出来的线程任务就得等其他线程任务执行完后再执行。
2.生成可变尺寸的线程池
public static ExecutorService newCachedThreadPool()
这种线程池可根据需要进行自动扩容,最大尺寸是Integer.MAX_VALUE。
3.生成延迟线程池
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
这种线程池对象有三种常用的方法:
a.从父接口ExecutorService的父接口Executor继承的void execute(Runnable command)方法,用法跟上面一样。
b.ScheduledExecutorService 接口自己的ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)方法,需要传3个参数。第一个参数传Runnable实例,第二个参数传延迟的时间量,第三个参数传延迟时间的单位,是枚举TimeUnit的一个元素。
c.ScheduledExecutorService 接口自己的ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)方法,需要传4个参数。第一个参数传Runnable实例,第二个参数传延迟的时间量,第三个参数传间隔时间,第四个参数传时间单位,同样是枚举TimeUnit的一个元素。从传的参数可以看出,这个方法可以用来做定时任务。例如,如果想5s执行一次某项任务,只需要把该项任务写在Runnable实现类的run方法体中,然后利用Executors创建一个延迟线程池,调用scheduleAtFixedRate(Runnable command, long initialDelay, long period,TimeUnit unit)方法即可,其中第三个参数传5,第四个参数传TimeUnit.SECONDS即可。
参考文章:
http://blog.csdn.net/coding_or_coded/article/details/6856014