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()创建 ...
随机推荐
- java http头信息
JAVA 从http请求头中获取Header信息: request.getHeader(),request.getHeaderNames(),request.getHeaders() Java获取Ht ...
- Cassandra Wiki Login JmxSecurity
JmxSecurity 监控和管理Cassandra
- 在Eclipse中使用Maven部署项目的Tomcat
方式一:打war包到tomcat/webapps目录 点击在项目上面 -> 右键 -> Run As -> Maven install 之后查看Maven输出路径: D:\apach ...
- Julia - 分数
在 Julia 中,使用“//”运算符构造分数 julia> 1 // 2 1//2 julia> - 1 // 2 -1//2 分数会自动进行约分 julia> 2 // 4 1/ ...
- ceph中用sgdisk工具进行分区--------固定uuid
ceph中两种类型分区的type code: type type code journal 45b0969e-9b03-4f30-b4c6-b4b80ceff106 osd 4fbd7e29-9d25 ...
- 热门数据挖掘模型应用入门(一): LASSO回归
热门数据挖掘模型应用入门(一): LASSO回归 2016-10-10 20:46 作者简介: 侯澄钧,毕业于俄亥俄州立大学运筹学博士项目, 目前在美国从事个人保险产品(Personal Line)相 ...
- 关于jquery.noConflict()的学习记录
今天无意中看到了jquery.noConfict()的实现方法 代码如下: var // Map over jQuery in case of overwrite _jQuery = window.j ...
- Swift 延迟运行代码
// // DelayRun.swift // // Created by XuQing on 16/7/1. // Copyright © 2016年 xuqing. All rights rese ...
- Netty生产级的心跳和重连机制
今天研究的是,心跳和重连,虽然这次是大神写的代码,但是万变不离其宗,我们先回顾一下Netty应用心跳和重连的整个过程: 1)客户端连接服务端 2)在客户端的的ChannelPipeline中加入一个比 ...
- leetcode260
public class Solution { public int[] SingleNumber(int[] nums) { var dic = new Dictionary<int, int ...