Executor并发性能对比
来源:互联网 发布:php linux 删除文件夹 编辑:程序博客网 时间:2024/06/05 09:47
<span style="font-family: Arial, Helvetica, sans-serif;">import java.util.ArrayList;</span>
import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.CompletionService;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.ExecutorCompletionService;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import org.apache.hadoop.io.IntWritable;public class ArrayTest {public static void main(String[] args) {long start = System.currentTimeMillis() ;ArrayTest blt = new ArrayTest() ;List<IntWritable> messages = new ArrayList<IntWritable>();for(int i =0 ;i<10000; i++) { messages.add(new IntWritable(i)) ;}//RejectedExecutionHandler retryHandler = new RetryRejectedExecutionHandler();// ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors// .newCachedThreadPool();// executor.setMaximumPoolSize(64);// executor.setRejectedExecutionHandler(retryHandler);// // for (IntWritable i : messages) {// executor.execute(blt.new Worker(i));// }//// executor.shutdown();// try {// executor.awaitTermination(60, TimeUnit.SECONDS);// } catch (Exception e) {// e.printStackTrace() ;// }ExecutorService pool = Executors.newCachedThreadPool(); // 并发测试CompletionService<Boolean> exchangeResult = new ExecutorCompletionService<Boolean>(pool);int destSize = 0;for(IntWritable i : messages) {exchangeResult.submit(blt.new Worker(i));destSize++;}int count = 0;while (count < destSize) {Future<Boolean> f = exchangeResult.poll();if (f == null)continue;count++ ;} try {pool.awaitTermination(60, TimeUnit.SECONDS);} catch (Throwable e) {e.printStackTrace();}System.out.println("Last " + (System.currentTimeMillis() - start) + " ms");} class Worker implements Callable<Boolean> {IntWritable msg;public Worker(IntWritable msg) {this.msg = msg;}@Overridepublic Boolean call() throws Exception {try { int sum = msg.get() ;} catch (Exception e) {e.printStackTrace() ;}return true;}}// class Worker implements Runnable {//IntWritable msg;////public Worker(IntWritable msg) {//this.msg = msg;//}////@Override//public void run() {//try {// int sum = msg.get() ;//} catch (Exception e) {//e.printStackTrace() ;//}//}//} }class RetryRejectedExecutionHandler implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace() ; } executor.execute(r); }}
第一种: Last 60186 ms
第二种:
package concurrencyTest;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.CompletionService;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentLinkedQueue;import java.util.concurrent.ExecutorCompletionService;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import org.apache.hadoop.io.IntWritable;public class ArrayTest {public static void main(String[] args) {long start = System.currentTimeMillis() ;ArrayTest blt = new ArrayTest() ;List<IntWritable> messages = new ArrayList<IntWritable>();for(int i =0 ;i<10000; i++) { messages.add(new IntWritable(i)) ;}RejectedExecutionHandler retryHandler = new RetryRejectedExecutionHandler(); ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors .newCachedThreadPool(); executor.setMaximumPoolSize(64); executor.setRejectedExecutionHandler(retryHandler); for (IntWritable i : messages) { executor.execute(blt.new Worker(i)); } executor.shutdown(); try { executor.awaitTermination(60, TimeUnit.SECONDS); } catch (Exception e) { e.printStackTrace() ; }//ExecutorService pool = Executors.newCachedThreadPool(); // 并发测试//CompletionService<Boolean> exchangeResult = new ExecutorCompletionService<Boolean>(//pool);//int destSize = 0;//for(IntWritable i : messages) {//exchangeResult.submit(blt.new Worker(i));//destSize++;//}////int count = 0;//while (count < destSize) {//Future<Boolean> f = exchangeResult.poll();//if (f == null)//continue;//count++ ;//}// try {//pool.awaitTermination(60, TimeUnit.SECONDS);//} catch (Throwable e) {//e.printStackTrace();//}System.out.println("Last " + (System.currentTimeMillis() - start) + " ms");}// class Worker implements Callable<Boolean> {//IntWritable msg;////public Worker(IntWritable msg) {//this.msg = msg;//}////@Override//public Boolean call() throws Exception {//try {// int sum = msg.get() ;//} catch (Exception e) {//e.printStackTrace() ;//}//return true;//}//} class Worker implements Runnable {IntWritable msg;public Worker(IntWritable msg) {this.msg = msg;}@Overridepublic void run() {try { int sum = msg.get() ;} catch (Exception e) {e.printStackTrace() ;}}} }class RetryRejectedExecutionHandler implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace() ; } executor.execute(r); }}
Last 271 ms
可能是前一种写法有问题,导致性能很差,但是奇怪没有报错!
第一种写法,即使用 Callable<Boolean>在线程数较少时(<100),没有问题,但是线程数较大,如100,000,则会由于资源不足而阻塞,性能急剧降低。
第二种写法则不存在此问题。
0 0
- Executor并发性能对比
- nginx和apache并发性能测试对比
- ngx_lua与go高并发性能对比
- ngx_lua与go高并发性能对比
- Executor并发框架
- 【Java】并发之Executor
- Java并发框架Executor
- java并发--Executor 框架
- Java并发之Executor
- Java并发框架Executor
- 并发编程-executor
- Executor并发框架
- 并发编程-Executor、锁
- java并发编程-Executor框架
- java并发编程-Executor框架
- java并发编程-Executor框架
- java并发编程-Executor框架
- java并发编程-Executor框架
- Codeforces 50A(往矩形里填多米诺骨牌)
- 商务旅行_codevs1036_lca
- bzoj 2982: combination lucas定理+乘法逆元
- SPI通信总线-51
- java 集合小记1
- Executor并发性能对比
- 一个Hello World的Arm汇编指令
- Less中文网 教程 概览部分
- OMX中的回调机制分析
- 每个阴狠的李莫愁,都曾是娇俏的小黄蓉
- 专业"偷懒"之利用sql生成Java实体类属性
- LeetCode Learning 3
- Java习题总结——基础才是最重要滴
- Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.