思路:

开三个线程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中线程切换的开销的更多相关文章

  1. java中线程同步的理解(非常通俗易懂)

    转载至:https://blog.csdn.net/u012179540/article/details/40685207 Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运 ...

  2. Java多线程并发03——在Java中线程是如何调度的

    在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...

  3. java中线程分两种,守护线程和用户线程。

    java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...

  4. java中线程机制

    java中线程机制,一开始我们都用的单线程.现在接触到多线程了. 多线性首先要解决的问题是:创建线程,怎么创建线程的问题: 1.线程的创建: 四种常用的实现方法 1.继承Thread. Thread是 ...

  5. Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞

    Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...

  6. Java中线程的实现:

    Java中线程的实现: 一.线程简介: 实现的两种方式为: 1.Thread类 2.Runnable接口 都在java.lang中 都有共通的方法:public void run() 二.线程常用方法 ...

  7. JAVA中线程同步方法

    JAVA中线程同步方法 1  wait方法:         该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所 ...

  8. 多线程(三) java中线程的简单使用

    java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依 ...

  9. Java中线程池,你真的会用吗?

    在<深入源码分析Java线程池的实现原理>这篇文章中,我们介绍过了Java中线程池的常见用法以及基本原理. 在文中有这样一段描述: 可以通过Executors静态工厂构建线程池,但一般不建 ...

随机推荐

  1. Golang 谷歌搜索api 实现搜索引擎(前端 bootstrap + jquery)

    Golang 谷歌搜索api 实现搜索引擎(前端 bootstrap + jquery) 体验 冒号搜索 1. 获取谷歌搜索api 谷歌搜索api教程 2. 后台调用 程序入口 main.go // ...

  2. 01 Web框架介绍

    一.Web框架本质 所有的web应用程序本质上都是socket,用户的浏览器其实就是一个socket客户端. python中常用的web框架有: Django Flask web.py WSGI(we ...

  3. JDK1.8 HashMap$TreeNode.rotateLeft 红黑树左旋

    红黑树介绍 1.节点是红色或黑色. 2.根节点是黑色. 3.每个叶子节点都是黑色的空节点(NIL节点). 4 每个红色节点的两个子节点都是黑色.(从每个叶子到根的所有路径上不能有两个连续的红色节点) ...

  4. 笔记-python-实用-程序运算时间计算

    方法1 import datetime starttime = datetime.datetime.now() #long running endtime = datetime.datetime.no ...

  5. LoadRunner11使用方法以及注意点收集

    一:安装loadrunner http://jingyan.baidu.com/article/f7ff0bfc1cc82c2e26bb13b7.html http://www.cnblogs.com ...

  6. Mysql - 安装及初始化设置

    1. 下载mysql-5.7.13-tar.gz http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.13-linux-glibc2.5-x8 ...

  7. python week08 并发编程之多进程--实践部分

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  8. day05_01 鸡汤+内容回顾

    推荐电影: 1.被解救的姜戈 2.华尔街之狼 3.阿甘正传 4.辛德勒的名单 5.肖申克的救赎 6.上帝之城 7.焦土之城 8.绝美之城 打印多行 msg = "hello 1 hello ...

  9. zabbix2.4升级到2.5 --考虑升级到zabbix3.0

    现在zabbix服务器,zabbix服务日志频繁出现MySQL server  has gone away,经搜索,此问题在zabbix2.5之前是zabbix的一个bug,zabbix2.5后已经修 ...

  10. Thanks for your encourage!

    将近三个月的学习,我的努力换回了代表荣誉的小黄衫,这令我很开心啊...我想是不是要写点什么来表达自己的心情呢=,=  于是就有了以下文字ahhhhhh... 学习心得: (1)学习中总会有失败和成功, ...