多线程技术博客二
1、睡眠
Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)静态方法强制当前正在执行的线程休眠(暂停执行),以“减慢线程”。当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态。
线程睡眠的原因:线程执行太快,或者需要强制进入下一轮,因为Java规范不保证合理的轮换。
睡眠的实现:调用静态方法。
睡眠的位置:为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程中会睡眠。
注意:
1、线程睡眠是帮助所有线程获得运行机会的最好方法。
2、线程睡眠到期自动苏醒,并返回到可运行状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行。
3、sleep()是静态方法,只能控制当前正在运行的线程。
2、线程的优先级和线程让步yield()
线程的让步是通过Thread.yield()来实现的。yield()方法的作用是:暂停当前正在执行的线程对象,并执行其他线程。
要理解yield(),必须了解线程的优先级的概念。线程总是存在优先级,优先级范围在1~10之间。JVM线程调度程序是基于优先级的抢先调度机制。在大多数情况下,当前运行的线程优先级将大于或等于线程池中任何线程的优先级。但这仅仅是大多数情况。
注意:当设计多线程应用程序的时候,一定不要依赖于线程的优先级。因为线程调度优先级操作是没有保障的,只能把线程优先级作用作为一种提高程序效率的方法,但是要保证程序不依赖这种操作。
设置线程的优先级:线程默认的优先级是创建它的执行线程的优先级。可以通过setPriority(int newPriority)更改线程的优先级。例如:
线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:
static int MAX_PRIORITY
线程可以具有的最高优先级。
static int MIN_PRIORITY
线程可以具有的最低优先级。
static int NORM_PRIORITY
分配给线程的默认优先级。
3、Thread.yield()方法
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。
yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。
结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
4、join()方法
Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。例如:
Thread t = new MyThread();
t.start();
t.join();
5、线程安全类
6、线程死锁
死锁对Java程序来说,是很复杂的,也很难发现问题。当两个线程被阻塞,每个线程在等待另一个线程时就发生死锁。
还是看一个比较直观的死锁例子:
假设read()方法由一个线程启动,write()方法由另外一个线程启动。读线程将拥有resourceA锁,写线程将拥有resourceB锁,两者都坚持等待的话就出现死锁。
实际上,上面这个例子发生死锁的概率很小。因为在代码内的某个点,CPU必须从读线程切换到写线程,所以,死锁基本上不能发生。
分享到:
相关推荐
Qt5多线程技术集锦,详情参见博客: https://blog.csdn.net/libaineu2004/article/details/106095491
原创的嵌入式多线程实验报告原创,情歌问大佬多多发表意见,新人初到,以后的博客会越来越有技术含量,文件会越来越有帮助
java爬虫多线程抓取图片,压缩包里边里边含有三个例子,博主亲测使用,没有问题,欢迎大家在博客给我留言,一起交流技术问题。
可以使用Java中的多线程技术,例如通过创建多个线程同时下载文件的不同部分,从而提高下载速度和效率。 断点续传设计:为了支持断点续传,需要在下载过程中记录已下载的文件部分,并在下次下载时从断点处继续下载。...
与本人博客文章“用于多设备并发的多线程架构设计”配套。代码涉及主线程与两个worker线程通过Event同步和回调函数的使用技术。
java实现FTP多线程断点续传,上传下载! - java学习与交流 - j2ee学习网 - j2ee学习网 (2012年5月21日) 用 Java 实现断点续传 (HTTP) (2012年5月21日) Java写的支持断点续传的FTP--crybaby的博客 (2012年5月21日) ...
Android多线程断点续传下载+在线播放音乐,我想很多小白都想要。
Android中实现断点续传下载功能,有详细的注释,需要的打包带走。
本资源里收藏大量大佬博客地址,包含多线程讲解,集合,锁,redis等一线技术博客讲解,喜欢抓紧下载把,不断更新中......本资源里收藏大量大佬博客地址,包含多线程讲解,集合,锁,redis等一线技术博客讲解,喜欢抓紧下载把,...
当我耐心整理了一些编程资源,...此外,我还整理了一些优质的编程书籍、博客和社区论坛,以便大家可以与其他编程爱好者交流经验,解决问题。希望这些资源能够激发大家对编程的兴趣,提升编程能力,实现自己的技术梦想!
烈风新浪博客漫游大师采用多线程底层网络协议技术,而不是在软件中嵌套浏览器,所以比自己手动访问博客快10倍以上。您只需要点击一下开始按钮,就能全自动、无需人工干扰的自行在新浪博客中漫游其它博客,无论您是做...
中间件技术 实验三 消息中间件应用开发: - CSDN博客 https://blog.csdn.net/lly1122334/article/details/80139790
【博客个人资源】 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、...
072. 51CTO技术博客 支持的微博网站 001. 新浪微博 002. 搜狐微博 003. 腾讯微博 004. 网易微博 005. 饭否 006. 天涯微博 007. 和讯微博 008. 51说说 支持的读书网站 001. 新浪读书 002. 腾讯读书 003. 搜狐读书 004...
多线程爬虫出现报错AttributeError: ‘NoneType’ object has no attribute ‘xpath’一、前言二、问题三、思考和解决问题四、运行效果 一、前言 mark一下,本技术小白的第一篇CSDN博客! 最近在捣鼓爬虫,看的是...
redis涉及到数据结构/算法/网络编程/信号/多进程通信/多线程同步/文件锁/磁盘io等相关技术知识。 上述技术可以参考《 APUE》《 UNP》书籍中的详细讲解。 文章 关于Redis的具体介绍已经全部移植技术博客里
C#实现冒泡排序法、选择排序法、快速排序法以及插入排序法。
烈风新浪博客漫游大师采用多线程底层网络协议技术,而不是在软件中嵌套浏览器,所以比自己手动访问博客快10倍以上。您只需要点击一下开始按钮,就能全自动、无需人工干扰的自行在新浪博客中漫游其它博客,无论您是做...
2.自定义多线程采集器 采集的技术未使用大部份采集器使用的关键词采集。而是采用正则表达式、Xpath等技术,适合有一定技术背景的人员来使用。在创建规则可以参考现有的几个模板。另外XMLSpy和RegexBuddy是很好用...
Spring Monkey 是一个是一款基于最新技术开发的多人在线、简洁的博客社区系统。 Java是一种高性能、跨平台的面向对象编程语言。它由Sun Microsystems(现在是Oracle Corporation)的James Gosling等人在1995年推出,...