通过util.concurrent.Executors直接创建线程池,非常方便
package thread.pool; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 使用线程池的好处: * 线程池维护一定数量的worker线程 * 调用者只需将任务放入到线程池中即可 * 具体任务的执行交给线程池中的线程去完成 * 主要为了提高系统响应能力 * concurrent为并发提供支持,关注并发 * synchronized同步为共享资源安全使用提供支持,关注共享数据被正确操作 */ class ThreadPool { private static ThreadPool pool = new ThreadPool(); public static ThreadPool getThreadPool() { return pool; } final int nThreads = 5; ExecutorService executor = null; //创建固定大小的线程池,线程池中的线程会不断被重用(当空闲时) private ThreadPool() { /** * 始终维护固定数量的线程,线程在执行过程中由于错误导致终止,将会自动创建新的线程进行替补 */ executor = Executors.newFixedThreadPool(nThreads); /** * 任务数超过线程池中处理任务的线程数量时,会自动创建新的线程并加入到线程池中执行任务 * 线程数量会根据任务多少动态变化(自动创建新线程或释放多余的空闲线程) */ //executor = Executors.newCachedThreadPool(); /** * 线程池中只有唯一线程,即使发生错误导致线程终止(在shutdown()调用之前),线程池会自动创建一个新的线程进行替补 * 与newFixedThreadPool(1)不同的时,此方法返回的executor确保线程池不会被添加新的线程,始终只有一个,能实现任务执行的连续性/前后性 */ //executor = Executors.newSingleThreadExecutor(); } public ThreadPool addTask(Runnable task) { executor.execute(task); return this; } public void shutdown() { executor.shutdown(); } } /** * 封装任务 */ class Task implements Runnable { //统计每个线程总共执行了多少个任务 private static ThreadLocal<Integer> dealTaskCount = new ThreadLocal<Integer>(); private String taskName; public Task(String taskName) { this.taskName = taskName; } public void run() { Integer taskCount = dealTaskCount.get(); taskCount = taskCount==null? 1 : ++taskCount; dealTaskCount.set(taskCount); System.out.println(Thread.currentThread().getName() + " dealing task: " + taskName +", complete task:" + taskCount); try { Thread.sleep(new Random().nextInt(100)); } catch (InterruptedException e) { e.printStackTrace(); } } } //Test public class Concurrent_ThreadPool { public static void main(String[] args) { ThreadPool pool = ThreadPool.getThreadPool(); //提交50个任务到线程池中 for(int i=1;i<=50;i++) { pool.addTask(new Task("Task"+i)); } //when server shutdown pool.shutdown(); } }
相关推荐
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError),内附解决方案!
java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1)
java并发工具包 java.util.concurrent中文版-带书签版
java.util.concurrent总体概览图。 收取资源分3分。需要的同学可以下载一下。 java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和...
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用
java并发工具包 java.util.concurrent中文版pdf
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
java.util.concurrent系列文章(2) java.util.concurrent系列文章(2) java.util.concurrent系列文章(2) java.util.concurrent系列文章(2)
主要介绍了java.util.concurrent.ExecutionException 问题解决方法的相关资料,需要的朋友可以参考下
标签:atlassian-util-concurrent-0.0.12.jar.zip,atlassian,util,concurrent,0.0.12,jar.zip包下载,依赖包
如何启动:以win7系统为例,最好jdk8 1.打开cmd,cd到jdk的path,本机是:cd C:\Java\jdk6\bin ...java -cp D:\javaConcurrentAnimated.jar vgrazi.concurrent.samples.launcher.ConcurrentExampleLauncher
Java并发编程工具包java.util.concurrent的UML类结构图 PDF
花了一段时间辛苦整理的ppt,与大家分享,请提出您的宝贵意见。
concurrent Synchronizer Framework,讲解整个并发框架的设计思路!
AQS作者Doug lea关于AQS设计、性能的paper,需要了解AQS的设计思想,思路可以参考这篇paper
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下
java.util.concurrent.ArrayBlockingQueueAPI介绍和简单案例