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()创建 ...
随机推荐
- 一个jquery-ajax post例子ajax 登陆
index.html文件 <html> <head> <meta http-equiv="Content-Type" content="te ...
- ubuntu下面搭建SolrCloud集群
首先要先把ubuntu环境搭建好,配置好静态IP,我这边配置的是3台机子,solr搭建集群至少是2台. 192.168.0.15 主机 192.168.0.16 从机 192.168.0.17 ...
- IP 地址 与 DNS
IP地址转化 192.168.10.1 十进制,点分十进制地址 32位二进制数字序列,四段,八位 十进制与二进制转换00000000 = 000000001 = 2 * 0 = 100000010 = ...
- 【学习笔记】Markdown入门
Markdown入门 最近把博客园的编辑器换成了Markdown. 语法入门 Markdown确实好用,本来我想总结一下常用Markdown的语法,但有下面这篇文章在,我实在是不敢画蛇添足了. 基 ...
- Julia - If 条件语句
Julia 中使用 if,elseif,else 进行条件判断 格式: if expression1 statement1 elseif expression2 statement2 else sta ...
- python‘s third day for me 字符串方法
基 础 数 据 类 型 初 始 int 运算.+ - * / ** %... bool: 判断,真假,作为条件. str: 存储少量的数据.操作简单,便于传输. list: 列表[ ...
- ethereum
几个网址 https://github.com/ethereum/go-ethereum/wikihttp://ethfans.org windows下安装以太币钱包 从下面网址下载钱包,不用安装是绿 ...
- PHP错误日志记录文件位置确定
1.确定web服务器 ( IIS, APACHE, NGINX 等) 以哪一种方式支持PHP,通常是有下面2种方式 通过模块加载的方式, 适用于apache 通过 CGI/fastCGI 模式, 该模 ...
- 基于 DirectX11 的 MMDViewer 01-简介
这个项目主要是为了 DirectX11 而来,前面做了一个关于 OpenGL 的项目,这次打算使用 DirectX11 来做一个 MMD 的模型浏览器.以前,我使用过 DirectX11 来做过一些项 ...
- ffmpeg源码分析四:transcode_step函数 (转4)
原帖地址:http://blog.csdn.net/austinblog/article/details/25099979 该函数的主要功能是一步完整的转换工作,下面看看源代码: static int ...