package com.wangbiao.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * @author wangbiao * @date and time Jun 18, 2014 3:16:12 PM * */ public class ThreadPoolStudy { public static void main(String[] args) { // create thread pool /* * Executors.newFixedThreadPool(3); * * 在任意点,在大多数 nThreads 线程会处于处理任务的活动状态。 * 若是在全部线程处于活动状态时提交附加任务,则在有可用线程以前,附加任务将在队列中等待。 * 若是在关闭前的执行期间因为失败而致使任何线程终止,那么一个新线程将代替它执行后续的任务(若是须要)。 * 在某个线程被显式地关闭以前,池中的线程将一直存在。 */ // ExecutorService threadPool = Executors.newFixedThreadPool(3); /* * * Executors.newCachedThreadPool(); * * 建立一个可根据须要建立新线程的线程池,可是在之前构造的线程可用时将重用它们。 * 对于执行不少短时间异步任务的程序而言,这些线程池一般可提升程序性能。 调用 execute 将重用之前构造的线程(若是线程可用)。 * 若是现有线程没有可用的,则建立一个新线程并添加到池中。 终止并从缓存中移除那些已有 60 秒钟未被使用的线程。 * 所以,长时间保持空闲的线程池不会使用任何资源。 注意,可使用 ThreadPoolExecutor * 构造方法建立具备相似属性但细节不一样(例如超时参数)的线程池。 */ // ExecutorService threadPool = Executors.newCachedThreadPool(); /* * Executors.newSingleThreadExecutor(); * * 建立一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。 * (注意,若是由于在关闭前的执行期间出现失败而终止了此单个线程,那么若是须要,一个新线程将代替它执行后续的任务)。 * 可保证顺序地执行各个任务,而且在任意给定的时间不会有多个线程是活动的。 与其余等效的 newFixedThreadPool(1) * 不一样,可保证无需从新配置此方法所返回的执行程序便可使用其余的线程 */ ExecutorService threadPool = Executors.newSingleThreadExecutor(); for (int i = 0; i <= 10; i++) {// excute 10 thread final int task = i; threadPool.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int j = 0; j <= 10; j++) { System.out.println(Thread.currentThread().getName() + "-" + "is loop of " + j + "-" + "is thread " + task); } } }); } // threadPool.shutdownNow();//试图中止全部正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。 threadPool.shutdown();// 启动一次顺序关闭,执行之前提交的任务,但不接受新任务。 // execute will be delay 10 seconds /* * Executors.newScheduledThreadPool(3).schedule(new Runnable() { * * @Override public void run() { // TODO Auto-generated method stub * System.out.println("begin to work"); } }, 10, TimeUnit.SECONDS); */ // execute will be delay 10 seconds, 2 seconds one execution Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("begin to work"); } }, 10, 2, TimeUnit.SECONDS); } }