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对性能有何帮助的更多相关文章

  1. [转]Java Thread Dump 性能分析

    Java and Thread 一个 web 服务器使用几十到几百个线程来处理大量并发用户,如果一个或多个线程使用相同的资源,线程之间的竞争就不可避免了,并且有时候可能会发生死锁. Thread co ...

  2. python3 线程 threading.Thread GIL性能详解(2.3)

    python3 线程 threading 最基础的线程的使用 import threading, time value = 0 lock = threading.Lock() def change(n ...

  3. Android线程管理之ExecutorService线程池

    前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...

  4. Java程序员必备知识-多线程框架Executor详解

    为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...

  5. C#多线程编程笔记

    在开发中经常有遇到因为程序执行的时间过长,而造成程序假死的情况,这是因为我们的程序是同步执行的,当执行到需要长时间的操作时,程序就会等待当前的操作完成,从而造成程序假死.C#的异步与多线程就是为了解决 ...

  6. 5、二、App Components(应用程序组件):0、概述

    二.App Components(应用程序组件) 0.概述   App Components Android's application framework lets you create rich ...

  7. 【Redis】1、Jedis对管道、事务以及Watch的操作来应对高并发

    对于一个互联网平台来说,高并发是经常会遇到的场景.最有代表性的比如秒杀和抢购.高并发会出现三个特点: 1.高并发读取 2.高并发写入(一致性) 3.出现超卖问题 前端如何应对? 1.缓存静态数据,例如 ...

  8. Java多线程框架Executor详解

       原文链接  http://www.imooc.com/article/14377 为什么引入Executor线程池框架new Thread()的缺点 每次new Thread()耗费性能调用ne ...

  9. Executor简析

    本文只做简要解析,实际情形下我们多用spring的taskExecutor 直接使用new Thread()创建线程的缺点: 1.new Thread()耗费性能 2.调用new Thread()创建 ...

随机推荐

  1. 初学者手册-Sublime Text常用快捷键

    Alt + F3 :找出当前文档中所有被划选的词语,若文档很大的话,可能会导致Sublime Text崩溃. Ctrl + kkk :删除当前行光标至行尾的所有内容. End: 光标跳至行尾. Hom ...

  2. 05:Sysbench压测-innodb_deadlock_detect参数对性能的影响

    目录 sysbench压测-innodb_deadlock_detect参数对性能的影响 一.OLTP测试前准备 二.进行OLTP测试 三.测试结果解读: 四.关于测试后的结论: 五.关于测试后的性能 ...

  3. 第十章 Secret & Configmap (中)

    10.3 在Pod中使用Secret 10.3.1 Volume方式 apiVersion: v1 kind: Pod metaata: name: mypod spec: containers: - ...

  4. Window app遇到的问题

    Windows下两个应用之间进行UDP通讯,必须要先互相发送过数据,才能收到其他的数据.解决方法: <Capabilities> <Capability Name="int ...

  5. 【洛谷】P2434 [SDOI2005]区间(暴力)

    题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...

  6. phpstorm 不能提示代码tp 3.2 $this->display等 解决办法

    phpstorm->file->Setting->Directorires 里把 ThinkPHP/Model 目录设置为 Excluded ,保存.

  7. 查看Android内存,cpu

    转自https://testerhome.com/topics/2583 一.查看内存 查看Android应用内存: adb shell dumpsys meminfo 1.查看详细的内存: adb ...

  8. OD 实验(十六) - 从对话框入手对程序的逆向

    对话框: 对话框从类型上分为两类:modal 对话框和 modeless 对话框,就是模态对话框和非模态对话框,也有叫成模式和非模式 模态对话框不允许用户在不同窗口间进行切换,非模态对话框允许用户在不 ...

  9. Julia - 短路求值

    && 和 || 的布尔运算符被称为短路求值 它们连接一系列布尔表达式,仅计算最少的表达式来确定整个链的布尔值 在表达式 a && b 中,只有 a 为 true 时才计 ...

  10. HTTP头的Expires与Cache-control区别

    2010年3月24日 a18ccms 发表评论 阅读评论 今天在群里聊天.说道了Expires.这里来说明下这两个的区别吧. 1.概念 Cache-control 用于控制HTTP缓存(在HTTP/1 ...