思路:

开三个线程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. ubuntu安装easygui模块

    使用pip安装easygui 如果未安装pip,则使用如下命令 sudo apt-get install python-pip 安装完pip后,使用如下命令安装easygui sudo pip ins ...

  3. 传智 Python基础班+就业班+课件 【最新完整无加密视频课程】

    点击了解更多Python课程>>> 传智 Python基础班+就业班+课件 [最新完整无加密视频课程] 直接课程目录 python基础 linux操作系统基础) 1-Linux以及命 ...

  4. 【python学习】新手基础程序练习(一)

    首先得先编一下程序员必须编的程序——Hello World……(这应该是程序员情结...) #coding=utf-8 #Version:python3.7.0 #Tools:Pycharm 2017 ...

  5. LeetCode(226)Invert Binary Tree

    题目 分析 交换二叉树的左右子树. 递归非递归两种方法实现. AC代码 class Solution { public: //递归实现 TreeNode* invertTree(TreeNode* r ...

  6. go语言结构体作为函数参数,采用的是值传递

    经过验证,go语言结构体作为函数参数,采用的是值传递.所以对于大型结构体传参,考虑到值传递的性能损耗,最好能采用指针传递. 验证代码: package main import ( "fmt& ...

  7. 笔记-python-urllib

    笔记-python-urllib 1.      简介 PYTHON3中将urllib,urllib2整合到URLLIB中 包括以下模块 urllib.request 请求模块(核心) urllib. ...

  8. Hadoop4.2HDFS测试报告之四

    第二组:文件存储读过程记录 测试系统组成 存储类型 测试程序或命令 测试文件大小(Mb) 文件个数(个) 客户端并发数(个) 读速率 (M/s) NameNode:1 DataNode:1 本地存储 ...

  9. js 判断ie的版本号

    //IE6判断: var isIE6 = !!window.ActiveXObject && !window.XMLHttpRequest; //或者: if(navigator.us ...

  10. Django模板导入和替换、以及对数据库的增加、查看

    静态文件引入的3中方式:例如对html模板里面对css样式的引入 STATIC_URL = '/static666/'STATICFILES_DIR=[ os.path.join(BASE_DIR,' ...