JDK线程池实践
来源:互联网 发布:javascript常用函数 编辑:程序博客网 时间:2024/06/06 03:11
JDK线程池,网上很多代码和示例,自己就实践一下,看看运行结果,加深理解。
public class Test { public static int getCoreSize() { int core = Runtime.getRuntime().availableProcessors(); System.out.println("core : " + core); return core; } /** * SinglePool。 * 预期结果:顺序执行 * @throws InterruptedException */ public static void singlePool() throws InterruptedException { ExecutorService es = Executors.newSingleThreadExecutor(); Runnable r1 = SimpleRunnable.getInstance(5); Runnable r2 = SimpleRunnable.getInstance(4); Runnable r3 = SimpleRunnable.getInstance(3); Runnable r4 = SimpleRunnable.getInstance(2); Runnable r5 = SimpleRunnable.getInstance(1); es.submit(r1); es.submit(r2); es.submit(r3); es.submit(r4); es.submit(r5); Thread.sleep(1000l); es.shutdown(); } /** * 线程不会终止,SinglePool。 * 预期结果:1个线程运行 * @throws InterruptedException */ public static void endlessSinglePool() throws InterruptedException { ExecutorService es = Executors.newSingleThreadExecutor(); Runnable r1 = EndlessRunnable.getInstance(); Runnable r2 = EndlessRunnable.getInstance(); Runnable r3 = EndlessRunnable.getInstance(); Runnable r4 = EndlessRunnable.getInstance(); Runnable r5 = EndlessRunnable.getInstance(); es.submit(r1); es.submit(r2); es.submit(r3); es.submit(r4); es.submit(r5); Thread.sleep(1000l); } /** * 线程不会终止,CachedPool。 * 预期结果:随机执行,所有线程执行 * @throws InterruptedException */ public static void endlessCachedPool() throws InterruptedException { ExecutorService es = Executors.newCachedThreadPool(); Runnable r1 = EndlessRunnable.getInstance(); Runnable r2 = EndlessRunnable.getInstance(); Runnable r3 = EndlessRunnable.getInstance(); Runnable r4 = EndlessRunnable.getInstance(); Runnable r5 = EndlessRunnable.getInstance(); es.submit(r1); es.submit(r2); es.submit(r3); es.submit(r4); es.submit(r5); Thread.sleep(1000l); // 结果:程序并不会终止,无任何信息执行。意味着shutdown无用。 // 代码分析: interruptIdleWorkers();终止空闲线程。通过thread.interrupt()。 // es.shutdown(); // 结果:程序并不会终止,报sleep被中断异常。shutdownNow会试图终止掉阻塞的线程,但因为while循环,并不会杀死线程。 // 代码分析: interruptWorkers();终止工作线程。通过thread.interrupt()。 //es.shutdownNow(); } /** * 线程不会终止,FixedPool。 * 预期结果:3个线程运行 * @throws InterruptedException */ public static void endlessFixedPool() throws InterruptedException { ExecutorService es = Executors.newFixedThreadPool(3); Runnable r1 = EndlessRunnable.getInstance(); Runnable r2 = EndlessRunnable.getInstance(); Runnable r3 = EndlessRunnable.getInstance(); Runnable r4 = EndlessRunnable.getInstance(); Runnable r5 = EndlessRunnable.getInstance(); es.submit(r1); es.submit(r2); es.submit(r3); es.submit(r4); es.submit(r5); Thread.sleep(1000l); } /** * 前置条件:core:2, max:4, queue:2。EndlessRunanble。 * 预期结果:加入2个任务,2个线程运行。加入4个线程,2个线程运行。 * 加入6个线程,4个线程运行,且运行的是1,2,5,6。加入8个线程,报拒绝异常。 * 关于线程生成策略思考:小于core,每个任务都新建线程:哥有的是线程资源,随便用,不用等; * 大于core小于core+queueSize,排队不生成新线程:虽然任务有点多,但还是可以负担得起。不增加新线程,节约开销; * 大于core+queueSize小于max,创建新线程处理新任务,旧的排队线程依然排队(不讲先来后到):扛不住了,找外援; * 大于max,根据策略处理新加的任务,默认拒绝:我处理不了了,拒绝新任务。 * @throws InterruptedException */ public static void threadPool() throws InterruptedException { ExecutorService es = new ThreadPoolExecutor(2, 4, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2)); EndlessRunnableWithState r1 = EndlessRunnableWithState.getInstance(1); EndlessRunnableWithState r2 = EndlessRunnableWithState.getInstance(2); EndlessRunnableWithState r3 = EndlessRunnableWithState.getInstance(3); EndlessRunnableWithState r4 = EndlessRunnableWithState.getInstance(4); EndlessRunnableWithState r5 = EndlessRunnableWithState.getInstance(5); EndlessRunnableWithState r6 = EndlessRunnableWithState.getInstance(6); EndlessRunnableWithState r7 = EndlessRunnableWithState.getInstance(7); EndlessRunnableWithState r8 = EndlessRunnableWithState.getInstance(8); es.submit(r1); es.submit(r2); Thread.sleep(3000l); System.out.println("sleep 1 over."); es.submit(r3); es.submit(r4); Thread.sleep(3000l); System.out.println("sleep 2 over."); es.submit(r5); es.submit(r6); Thread.sleep(3000l); System.out.println("sleep 3 over."); es.submit(r7); es.submit(r8); } /** * 预期结果:4个线程执行同一个任务。 * 结果分析:每次commit,将任务包装为RunnableFuture对象,然后进行后续操作。不会判断任务是否已存在。同一个任务多个线程执行,得注意线程安全。 * @throws InterruptedException */ public static void taskRunMultiTime() throws InterruptedException { ExecutorService es = Executors.newFixedThreadPool(4); EndlessRunnableWithState r1 = EndlessRunnableWithState.getInstance(1); es.submit(r1); es.submit(r1); es.submit(r1); es.submit(r1); Thread.sleep(3000l); } public static void main(String[] args) throws InterruptedException { //singlePool(); //endlessSinglePool(); //endlessCachedPool(); //endlessFixedPool(); // threadPool(); taskRunMultiTime(); }}
public class SimpleRunnable implements Runnable { private int count; private SimpleRunnable(int count) { this.count = count; } public static SimpleRunnable getInstance(int count) { return new SimpleRunnable(count); } @Override public void run() { System.out.println(Thread.currentThread().getName() + " running ... with count : " + count); }}
public class EndlessRunnable implements Runnable { public static EndlessRunnable getInstance() { return new EndlessRunnable(); } @Override public void run() { System.out.println(Thread.currentThread().getName() + " running ..."); while (true) { try { Thread.sleep(10000l); } catch (InterruptedException e) { e.printStackTrace(); } } }}
public class EndlessRunnableWithState implements Runnable { private int count; private EndlessRunnableWithState(int count) { this.count = count; } public static EndlessRunnableWithState getInstance(int count) { return new EndlessRunnableWithState(count); } @Override public void run() { System.out.println("thread " + count + " running ..."); while (true) { try { Thread.sleep(10000l); } catch (InterruptedException e) { e.printStackTrace(); } } }}
0 0
- JDK线程池实践
- JDK中的线程池
- ThreadPoolExecutor JDK线程池
- jdk线程池详解
- 线程池使用实践
- java线程池实践
- JDK线程池的使用
- JDK线程池的使用
- JDK线程池的使用
- jdk线程池主要原理
- jdk源码学习:线程池
- jdk线程池-ThreadPoolExecutor机制
- JDK线程池源码分析
- JDK线程池使用小结
- JDK线程池的实现
- 一、JDK线程池概要
- JDK线程池源码分析
- JAVA线程池应用实践
- hibernate 中left join 与left join fetch ,right join与right join fetch 等的区别
- VMware 安装 CentOS 7.0 测试 RAID
- UIWebView 请求PC网址
- WebSocket 实战
- 计算几何算法概览
- JDK线程池实践
- 支付宝支付公钥私钥等参数设置
- HDFS JAVA客户端的权限错误:Permission denied
- 第三十九课——数字游戏
- java之反射技术(一)
- kafka之partition消费者并行度测试心得
- 提交form表单如何让页面在提交后不发生跳转
- maven查找配置jar仓库信息
- 写MySQL存储过程实现动态执行SQL