java中线程切换的开销
思路:
开三个线程A,B,C
线程A不断的调用LockSupport.park()阻塞自己,一旦发现自己被唤醒,调用Thread.interrupted()清除interrupt标记位,同时增加自增计数
线程B不断的调用线程A的interrupt()方法,将线程A从阻塞中唤醒,一旦唤醒成功,则自增计数
线程C定时输出计数
代码如下
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport; /**
* Created by cc on 2017/2/6.
*/
public class Test {
public static void main(String[] args) {
final AtomicInteger count = new AtomicInteger(0);
final Thread thread = new Thread(new Runnable() {
public void run() {
while (true) {
LockSupport.park();
Thread.interrupted();//clear interrupt flag
}
}
}); for(int i =0;i<1;i++) {
new Thread(new Runnable() {
public void run() {
while (true) {
if (!thread.isInterrupted()) {
thread.interrupt();
count.incrementAndGet();
}
}
}
}).start();
}
new Thread(new Runnable() {
public void run() {
long last = 0;
while (true) {
try {
Thread.sleep(1000);
System.out.println(String.format("thread park %d times in 1s", count.get() - last));
last = count.get();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); thread.start();
}
}
测试环境是
CPU:I5 6500 ,默频3.2G,测试的时候睿频至3.3G出头
内存:ddr4 2400 8g * 2,双通道模式
测试结果如下
thread park 380473 times in 1s
thread park 376364 times in 1s
thread park 371700 times in 1s
thread park 374485 times in 1s
thread park 375717 times in 1s
thread park 380483 times in 1s
thread park 370507 times in 1s
thread park 382291 times in 1s
thread park 377581 times in 1s
thread park 373198 times in 1s
thread park 371367 times in 1s
thread park 372876 times in 1s
thread park 394815 times in 1s
thread park 366434 times in 1s
thread park 391827 times in 1s
thread park 383691 times in 1s
thread park 380567 times in 1s
thread park 385234 times in 1s
thread park 367482 times in 1s
thread park 373650 times in 1s
thread park 375471 times in 1s
thread park 383743 times in 1s
thread park 377532 times in 1s
thread park 377353 times in 1s
thread park 386828 times in 1s
thread park 374503 times in 1s
thread park 373831 times in 1s
thread park 396207 times in 1s
thread park 374918 times in 1s
thread park 370150 times in 1s
thread park 378990 times in 1s
thread park 375449 times in 1s
thread park 406158 times in 1s
thread park 389793 times in 1s
thread park 371424 times in 1s
thread park 354746 times in 1s
thread park 384065 times in 1s
thread park 378894 times in 1s
thread park 358754 times in 1s
thread park 372588 times in 1s
大概每秒钟能完成38w次线程切换,平均每次切换耗时2.63us
做个对比
在单线程运行时,每秒钟可以完成1.6亿次的AtomicLong.increaseAndGet()操作,可以完成33亿次long型变量的自增操作
若干个数量级的差距,所以线程切换是一个开销很大的操作,应当尽量注意
java中线程切换的开销的更多相关文章
- java中线程同步的理解(非常通俗易懂)
转载至:https://blog.csdn.net/u012179540/article/details/40685207 Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运 ...
- Java多线程并发03——在Java中线程是如何调度的
在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- java中线程机制
java中线程机制,一开始我们都用的单线程.现在接触到多线程了. 多线性首先要解决的问题是:创建线程,怎么创建线程的问题: 1.线程的创建: 四种常用的实现方法 1.继承Thread. Thread是 ...
- Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞
Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...
- Java中线程的实现:
Java中线程的实现: 一.线程简介: 实现的两种方式为: 1.Thread类 2.Runnable接口 都在java.lang中 都有共通的方法:public void run() 二.线程常用方法 ...
- JAVA中线程同步方法
JAVA中线程同步方法 1 wait方法: 该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所 ...
- 多线程(三) java中线程的简单使用
java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依 ...
- Java中线程池,你真的会用吗?
在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...
随机推荐
- C#基础-数组
数组定义 定义数组并赋值 int[] scores = { 45, 56, 78, 98, 100 }; //在定义数组时赋值 for(int i = 0; i < scores.Length; ...
- html页面简单访问限制
PS:突然发现博客园有密码保护功能,已经可以满足基本需求了.博客园还能备份自己的所有数据,做到了数据归用户所有,平台只是展示,真是良心网站,大赞. 想要通过一个站点放一些东西给一些人看,但是又不想让所 ...
- 关于PHP连接池扩展php-cp遇到的那些坑
php-cp是国内大神写的php第三方扩展,具体就不用多说了,细读https://github.com/swoole/php-cp,下面来说说今天安装方法. 环境:CentOS7.2.1511 由于本 ...
- uvm transaction modeling
1.what is transaction? network transactions tcp/ip wifi 3g/4g bus transactions amba-ahb/apb/axi pci/ ...
- Python基础——字符串操作
运算符 加(+) str2="hello"+"python" print(str2) 乘(*) str1="hello python" ...
- CodeForces - 485D Maximum Value (数学)
题意: n个数,求出这些数中满足 ai >= aj 的 ai % aj 的最大值. 排序去重,然后对于每一个a[i], 如果找到a[i] 的一个倍数 k*a[i] (k > 1)的位置,那 ...
- Linux学习-逻辑滚动条管理员 (Logical Volume Manager)
LVM 可以整合多个实体 partition 在一起, 让这些 partitions 看起来就像是一个磁盘一样!而且,还可以在未来新增或移除其他的实 体 partition 到这个 LVM 管理的磁盘 ...
- 串口编程的相关API函数
用户使用函数CreateFile()创建与指定串口相关联的文件,然后可以使用该函数返回的文件句柄进行串口参数设置.• 01 HANDLE hModem; //定义串口句柄02 hModem=Creat ...
- BZOJ 4368: [IOI2015]boxes纪念品盒
三种路径,左边出去左边回来,右边出去右边回来,绕一圈 绕一圈的路径最多出现一次 那么绕一圈的路径覆盖的点一定是左边半圈的右边和右边半圈的左边 枚举绕一圈的路径的起始点(一定要枚举,这一步不能贪心),更 ...
- myeclipse中hibernate生成映射文件
在hibernate中,每个数据表对应的其实是一个实体类,每个实体类有一个对应的hbm.xml配置文件匹配,myeclipse中有个MyEclipse Database Explorer视图,它提供了 ...