思路:

开三个线程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. paper:基于verilog HDL 的高速可综合FSM设计

    1.寄存器输出型状态机 VS 组合逻辑输出型状态机 2.状态编码方法 这块讲的不好,也比较少. 3.系统设计中模块划分的指导性原则

  2. poj-2488 a knight's journey(搜索题)

    Time limit1000 ms Memory limit65536 kB Background The knight is getting bored of seeing the same bla ...

  3. UVALive - 3942 Remember the Word (Trie + DP)

    题意: 给定一篇长度为L的小写字母文章, 然后给定n个字母, 问有多少种方法用这些字母组成文章. 思路: 用dp[i]来表达[i , L]的方法数, 那么dp[i] 就可以从dp[len(x) + i ...

  4. CSS动画小结

    CSS动画 原理:1.画面之间变化  2.视觉暂留作用 常见问题 1.CSS 动画的实现方式有几种 1.transition  2. keyframes(animation) 2.过渡动画和关键帧动画 ...

  5. UVa 12235 状压DP Help Bubu

    题解戳这 一开始没看懂题解,后来想明白以后,d(i, j, s, x)是考虑第i本书的时候,前面已经拿走了j本书,剩下的书的种类的二进制状态为s,剩下的最后一本书的编号为x,所能得到的最小混乱度. 这 ...

  6. 下拉列表 Spinner

    在Web开发中,HTML提供了下拉列表的实现,就是使用<select>元素实现一个下拉列表,在其中每个下拉列表项使用<option>表示即可.这是在Web开发中一个必不可少的交 ...

  7. luogu1736 创意吃鱼法

    好的题解使人一下就懂啊-- s1[i][j]表示(i,j)最多向左(或右)延伸多少个格子,使这些格子中的数都是0(不包括(i,j)) s2[i][j]表示(i,j)最多向上延伸多少个格子,使这些格子中 ...

  8. 1.部署虚拟环境安装linux系统

    第1章 部署虚拟环境安装linux系统 章节简述: 本章从零基础详细讲解了虚拟机软件与红帽Linux系统,完整演示了VM虚拟机的安装与配置过程,以及红帽RHEL 7系统的安装.配置过程和初始化方法.此 ...

  9. python - 字符串的格式化输出

    # -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_2_str.py@ide: PyCharm Community ...

  10. pip安装超时,更换国内镜像源安装

    pip安装超时问题 pip install --index 源地址 安装包 常用镜像源地址: http://pypi.douban.com/ 豆瓣 http://pypi.mirrors.ustc.e ...