先抛出一问题?
都说sleep与yield有哪些哪些的区别,那我问:
sleep(0)与yield()有什么区别呢?
相关的说明晚上发布,白天估计没时间写,工作要紧。
本来晚上来发布的,关键时候,电脑没带回来,哈哈,明天一定补上。
其实后面几点
sleep,yield,join,priority与daemon都比较简单,用几个例子说明一下就可以。打算一次性把例子全放上,再分析一下这些方法的作用,基本上就OK了。
只有到线程池才又是一重点。
更新开始:
先来回答上面的问题:
两者的区别在于,一个调用的是本地的native void sleep(millis)方法,一个是调用的是本地的native void yield()方法。
由于具体的代码看不到:
只能功能分析:
因为sleep方法调用后,不会释放锁,只是暂停执行而已;与yield()方法调用后是一样的。
别的功能基本上是一样的。所以本地方法中可能在sleep(millis)中系统计算时间,当millis到0时,再调用与yield一样的处理方式。
yield()方法不会释放锁,这点在API中没有说明,不过可以通过下面的例子进行测试:
package thread;
import java.util.concurrent.locks.ReentrantLock;
public class YieldSleepThread {
public static void main(String[] args) {
Long t_start = System.currentTimeMillis();
User_lock u = new User_lock("张三", 0);
Thread_lock t1 = new Thread_lock("线程A", u, 20);
Thread_lock t2 = new Thread_lock("线程B", u, -30);
Thread_lock t3 = new Thread_lock("线程C", u, -40);
Thread_lock t4 = new Thread_lock("线程d", u, -50);
Thread_lock t5 = new Thread_lock("线程e", u, -60);
Thread_lock t6 = new Thread_lock("线程f", u, -70);
Thread_lock t7 = new Thread_lock("线程g", u, -80);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
/**
* 以下代码用于计算时间,当然,它本身的运行也会需要一点点时间,但与分析运行效率无影响
*/
boolean flag = true;
while (flag) {
if (Thread_lock.activeCount() == 1) {
Long t_end = System.currentTimeMillis();
System.out.println("当前时间:" + (t_end - t_start));
flag = false;
}
}
}
}
class Thread_lock extends Thread {
private User_lock u;
private int y = 0;
Thread_lock(String name, User_lock u, int y) {
super(name); // 线程的名称
this.u = u;
this.y = y;
}
public void run() {
u.oper(y);
}
}
class User_lock {
private String code;
private Integer cash;
User_lock(String code, int cash) {
this.code = code;
this.cash = cash;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
/**
* 业务方法
*
* @param x
* 添加x万元
*/
public synchronized void oper(int x) {
// try{
System.out.println("Thread.currentThread().getName()"+Thread.currentThread().getName());
// Thread.sleep(0);// 作用:增加运行时间
for(long i=0;i<9999999;i++);
Thread.yield();
this.cash += x;
System.out.println(Thread.currentThread().getName() + " 运行结束1,增加“"
+ x + "”,当前用户信息:" + toString());
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
@Override
public String toString() {
return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}';
}
}
运行结果:
Thread.currentThread().getName()线程A
线程A 运行结束1,增加“20”,当前用户信息:User{code='张三', cash=20}
Thread.currentThread().getName()线程d
线程d 运行结束1,增加“-50”,当前用户信息:User{code='张三', cash=-30}
Thread.currentThread().getName()线程C
线程C 运行结束1,增加“-40”,当前用户信息:User{code='张三', cash=-70}
Thread.currentThread().getName()线程e
线程e 运行结束1,增加“-60”,当前用户信息:User{code='张三', cash=-130}
Thread.currentThread().getName()线程f
线程f 运行结束1,增加“-70”,当前用户信息:User{code='张三', cash=-200}
Thread.currentThread().getName()线程B
线程B 运行结束1,增加“-30”,当前用户信息:User{code='张三', cash=-230}
Thread.currentThread().getName()线程g
线程g 运行结束1,增加“-80”,当前用户信息:User{code='张三', cash=-310}
当前时间:547
很明显的一点,就是我的机子比较慢,应该在200左右的比较正常。
从上面的例子可以看到,不会释放锁;可以把上例子中的synchronized关键字去掉,试试,输出不会是A->A的。
还是回到sleep方法上来。
sleep(long millis, int nanos)或sleep(long millis)
其实nanos这个参数没多大用可以看这句:
if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
millis++;
}
所以,加个50000以下的,系统根本不算。哎!这东西就是骗人用的。
再说一下,因为sleep()方法让当年线程暂停执行,那么别的线程都可能能获取CPU,这也就为相对于,线程优先级比较低的也可能获取。(sleep(0)就先不说了,还是用yield()代替吧。)而yield()方法只是停下,接着去抢CPU,所以优先级低的,还是很难与高的相抢。
还有一点要说明的是sleep()会抛异常?
什么时候会出现这种情况呢?比如还在sleep的过程中,你突然想interrupte一下,是的,这个时候就要也异常了,不过这种异常没关系,你只要过滤一下就OK了,但是记住,如果不加,就是报错了。(现在都用IDE写代码,这种问题会自报。)
先到这里了。
Java多线程及线程池专题http://ciding.iteye.com/blog/1300110
分享到:
相关推荐
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
基于java的学生网上请假系统的开题报告.docx
社会经济繁荣发展的今天,电子商务得到了飞速发展,网上交易越来越彰显出其独特的优越性,在人们的日常生活中,出现了各种类型的交易网站。其中一个就是车辆易主交易网站,它是一个服务于用户买卖二手车辆的交易网站,为用户提供了平等互利、方便快捷的网上交易平台,通过这一类型的网站,用户可自由出售和购买车辆。 本课题主要根据车辆本身的特性,充分发挥互联网的特点与优势,构建一个以二手车辆为商品、基于互联网平台的车辆易主业务交易管理系统,并根据车辆易主业务交易管理系统的应用需求,进行需求分析,进而对网站系统作规划设计。采用IDEA为运行平台,以SSH为框架,运用HTML语言、JSP技术、MySql数据库、JSP与后台数据库链接等关键技术建设二手车网上交易系统,构建车辆易主交易系统的会员注册与登录,网站首页展示、用户发布商品车辆,用户求购商品车辆,分页浏览、购物系统、用户后台管理、管理员用户后台管理等功能,并使这些功能得以实现并更好为用户服务。网站整体构建完成且测试成功后,用户可以进入网站进行注册、登录,登录后,用户可以在网站上发布自己的闲置车辆或者寻找想要购买的车辆,还可以收藏车辆,管理发布和收藏的车辆,
SQLite3的向量扩展库,windows dll,版本0.1.5
基于C++实现(控制台)商品库存管理系统