4.3.3 thread对性能有何帮助
public class ThreadLocalDemo {
public static final int GE_COUNT = 10000000;
public static final int THREAD_COUT = 4; static ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUT);
public static Random random = new Random(123); public static ThreadLocal<Random> randomThreadLocal = new ThreadLocal<Random>() {
protected Random initialValue() {
return new Random(123);
}
}; public static class RandomTask implements Callable<Long> { private int mode = 0; public RandomTask(int mode) {
this.mode = mode;
} public Random getRandom() {
if (mode == 0) {
return random;
} else if (mode == 1) {
return randomThreadLocal.get();
} else {
return null;
}
} public Long call() throws Exception {
long b = System.currentTimeMillis(); for (int i = 0; i < GE_COUNT; i++) {
getRandom().nextInt();
}
long e = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + " spend" + (e - b) + "ms");
return e - b;
}
} public static void main(String args[]) throws ExecutionException, InterruptedException {
Future<Long>[] futures = new Future[THREAD_COUT];
for (int i = 0; i < THREAD_COUT; i++) {
futures[i] = executorService.submit(new RandomTask(0));
} long totalTime = 0; for (int i = 0; i < THREAD_COUT; i++) {
totalTime += futures[i].get();
}
System.out.println("多线程访问同一个Random实例:" + totalTime + "ms");
executorService.shutdown();
executorService=Executors.newFixedThreadPool(4);
//ThreadLocal的情况
for (int i = 0; i < THREAD_COUT; i++) {
futures[i] = executorService.submit(new RandomTask(1));
}
totalTime = 0;
for (int i = 0; i < THREAD_COUT; i++) {
totalTime += futures[i].get();
}
executorService.shutdown();
System.out.println("使用ThreadLocal包装Random实例:" + totalTime + "ms"); } 运行结果:
pool-1-thread-3 spend1353ms
pool-1-thread-1 spend1542ms
pool-1-thread-2 spend1573ms
pool-1-thread-4 spend1593ms
多线程访问同一个Random实例:6061ms
pool-2-thread-1 spend531ms
pool-2-thread-2 spend512ms
pool-2-thread-3 spend450ms
pool-2-thread-4 spend414ms
使用ThreadLocal包装Random实例:1907ms
4.3.3 thread对性能有何帮助的更多相关文章
- [转]Java Thread Dump 性能分析
Java and Thread 一个 web 服务器使用几十到几百个线程来处理大量并发用户,如果一个或多个线程使用相同的资源,线程之间的竞争就不可避免了,并且有时候可能会发生死锁. Thread co ...
- python3 线程 threading.Thread GIL性能详解(2.3)
python3 线程 threading 最基础的线程的使用 import threading, time value = 0 lock = threading.Lock() def change(n ...
- Android线程管理之ExecutorService线程池
前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...
- Java程序员必备知识-多线程框架Executor详解
为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...
- C#多线程编程笔记
在开发中经常有遇到因为程序执行的时间过长,而造成程序假死的情况,这是因为我们的程序是同步执行的,当执行到需要长时间的操作时,程序就会等待当前的操作完成,从而造成程序假死.C#的异步与多线程就是为了解决 ...
- 5、二、App Components(应用程序组件):0、概述
二.App Components(应用程序组件) 0.概述 App Components Android's application framework lets you create rich ...
- 【Redis】1、Jedis对管道、事务以及Watch的操作来应对高并发
对于一个互联网平台来说,高并发是经常会遇到的场景.最有代表性的比如秒杀和抢购.高并发会出现三个特点: 1.高并发读取 2.高并发写入(一致性) 3.出现超卖问题 前端如何应对? 1.缓存静态数据,例如 ...
- Java多线程框架Executor详解
原文链接 http://www.imooc.com/article/14377 为什么引入Executor线程池框架new Thread()的缺点 每次new Thread()耗费性能调用ne ...
- Executor简析
本文只做简要解析,实际情形下我们多用spring的taskExecutor 直接使用new Thread()创建线程的缺点: 1.new Thread()耗费性能 2.调用new Thread()创建 ...
随机推荐
- ActiveMQ的多种部署方式--ActiveMQ学习之二
单点的ActiveMQ作为企业应用无法满足高可用和集群的需求,所以ActiveMQ提供了master-slave.broker cluster等多种部署方式,但通过分析多种部署方式之后我认为需要将两种 ...
- Memcached: temple
ylbtech-Memcached: temple 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 ...
- Mysql无法创建外键的原因 !!!
在MySQL中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...
- uboot环境变量的设置(未完待续)
使用print打印当前系统环境变量. 1. SMDK2440 # print baudrate=115200 bootargs=noinitrd root=/dev/nfs nfsroot=192.1 ...
- Java Thread 多线程同步、锁、通信
参看:http://www.cnblogs.com/hoojo/archive/2011/05/05/2038101.html
- Cocos2d-html5帧动画
单独获取plist里面一个文件: cc.SpriteFrameCache.getInstance().addSpriteFrames(s_test_plist); var spriteTest2 = ...
- supervisor+uwsgi+django遇到writing to a closed pipe/socket/fd解决
原因: 最近开发的一个项目,由于有个更新job需要消耗的时间非常长,一度以为更新出现了错误. 经过: 于是打开debug模式测试, 异常开启,调试发现system返回了 writing to a cl ...
- 把价钱转化为xx.xx的形式
把number类型转化为字符串类型let orderPayFeeStr = this.state.orderPayFee.toString();//商品价格转化为字符串if(orderPayFeeSt ...
- ceph---luminous 块存储(RBD)搭建
1. 创建pool 创建存储池: ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] [crush-ruleset-n ...
- 1.celery概述
1. 问题抛出 我们在做网站后端程序开发时,会碰到这样的需求:用户需要在我们的网站填写注册信息,我们发给用户一封注册激活邮件到用户邮箱,如果由于各种原因,这封邮件发送所需时间较长,那么客户端将会等待很 ...