Java多线程之ThreadPoolExecutor
2015-12-30 22:50
260 查看
1.ExecutorService demo
package com.ccy.thread.demo; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * * <p> * Title: ThreadPoolTest.java * Package com.ccy.thread.demo * </p> * <p> * Description: 线程池简单demo * <p> * @author Tom.Cai * @created 2015-12-30 下午10:45:14 * @version V1.0 * */ public class ThreadPoolTest { public static void main(String[] args) { //创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。 ExecutorService threadPool = Executors.newFixedThreadPool(3); for (int i = 0; i < 6; i++) { Runnable worker = new workThread(String.valueOf(i)); threadPool.execute(worker); } //启动一次顺序关闭,执行以前提交的任务,但不接受新任务。 threadPool.shutdown(); // 如果关闭后所有任务都已完成,则返回 true。 while (!threadPool.isTerminated()) { } System.out.println("all threads Finished"); } } class workThread implements Runnable{ private String command; public workThread(String command){ this.command = command; } @Override public void run() { System.out.println(Thread.currentThread().getName()+" Start time-"+command); try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" End !!!"); } }
2.ThreadPoolExecutor demo
package com.ccy.thread.demo; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * * <p> * Title: ThreadPoolExecutorTest.java * Package com.ccy.thread.demo * </p> * <p> * Description: 线程池监控demo * <p> * @author Tom.Cai * @created 2015-12-30 下午10:48:21 * @version V1.0 * */ public class ThreadPoolExecutorTest { public static void main(String[] args) throws Exception { RejectedExecutionHandlerImpl rejectionHandler = new RejectedExecutionHandlerImpl(); ThreadFactory threadFactory = Executors.defaultThreadFactory(); //在初始化 ThreadPoolExecutor 时,初始线程池大小设为2、最大值设为4、线程工作等待队列大小设为2。 //所以,如果当前有4个任务正在运行而此时又有新任务提交,工作队列将只存储2个任务和其他任务将交由RejectedExecutionHandlerImpl 处理。 ThreadPoolExecutor executorPool = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2), threadFactory, rejectionHandler); MonitorThread monitor = new MonitorThread(executorPool); Thread monitorThread = new Thread(monitor); monitorThread.start(); for(int i=0; i<10; i++){ executorPool.execute(new workerThread(String.valueOf(i))); } Thread.sleep(30000); executorPool.shutdown(); Thread.sleep(5000); monitor.shutdown(); } } class RejectedExecutionHandlerImpl implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { System.out.println(r.toString() + " is rejected"); } } class MonitorThread implements Runnable{ private ThreadPoolExecutor executor; private boolean runFlag = true; public MonitorThread(ThreadPoolExecutor executor){ this.executor = executor; } public void shutdown(){ this.runFlag = false; } @Override public void run() { while(runFlag){ System.out.println( String.format("[monitor] [%d/%d] Active: %d, Completed: %d, Task: %d, isShutdown: %s, isTerminated: %s", // 返回池中的当前线程数。 this.executor.getPoolSize(), // 返回核心线程数。 this.executor.getCorePoolSize(), this.executor.getActiveCount(), this.executor.getCompletedTaskCount(), //返回曾计划执行的近似任务总数。 this.executor.getTaskCount(), this.executor.isShutdown(), this.executor.isTerminated())); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } } class workerThread implements Runnable{ private String command; public workerThread(String command){ this.command = command; } @Override public void run() { System.out.println(Thread.currentThread().getName()+" Start time-"+command); try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" End !!!"); } }
更多多线程精彩内容请继续关注我的博客:http://blog.csdn.net/caicongyang
记录与分享,你我共成长 -from caicongyang
相关文章推荐
- HBase 开发环境搭建(Eclipse+Maven)
- [二]SpringMvc实践-注解
- java 数组复制
- Jmeter-java请求执行报错:java.lang.NoSuchFieldError: INSTANCE
- java常用建模工具汇总
- LinkedHashMap分析
- 菜鸟猿大战Java之IO系列(二)
- 关于 JAVA wait()和notify()
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
- java Pattern和Matcher详解
- eclipse里面设置JVM参数的问题
- java 文件处理总结
- 隐马尔可夫模型的前向算法(java实现),今天奉上
- 利用eclipse export功能制作可执行的jar包
- Intellij 配置 JDK1.8 语法支持
- 菜鸟猿大战Java之IO系列(一)
- RxJava使用总结
- javaWeb Jsp入门和常用对象的使用
- java学习:数据库的使用
- Android studio 如何导入Eclipse项目