java线程的阻塞及唤醒

1. sleep() 方法:
sleep(…毫秒),指定以毫秒为单位的时间,使线程在该时间内进入线程阻塞状态,期间得不到cpu的时间片,等到时间过去了,线程重新进入可执行状态。(暂停线程,不会释放锁)
//测试sleep()方法
class Thread7 implements Runnable{
@Override
public void run() {
for(int i=0;i<50;i++){
System.out.println(Thread.currentThread().getName()+"num="+i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Thread8 implements Runnable{
@Override
public void run() {
for(int i=0;i<1000;i++){
System.out.println(Thread.currentThread().getName()+"num="+i);
}
}
}
public static void main(String[] args) {
/*
* 测试线程阻塞
*/
//测试sleep()方法
Thread7 t7=new Thread7();
Thread8 t8=new Thread8();
Thread t81=new Thread(t8, "饺子");
Thread t71=new Thread(t7, "包子");
Thread t72=new Thread(t7, "面包");
t71.start();
t81.start();
t72.start();
}
2.suspend() 和 resume() 方法:。
挂起和唤醒线程,suspend()使线程进入阻塞状态,只有对应的resume()被调用的时候,线程才会进入可执行状态。(不建议用,容易发生死锁)
//测试suspend()和resume()方法
class Thread9 implements Runnable{
@Override
public void run() {
for(long i=0;i<500000000;i++){
System.out.println(Thread.currentThread().getName()+" num= "+i);
}
}
}
public static void main(String[] args) {
//测试suspend和resume
Thread9 t9=new Thread9();
Thread t91=new Thread(t9,"包子");
t91.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t91.suspend();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t91.resume();
}
(在控制台打印输出的时候,会停顿2秒钟,然后再继续打印。)
3. yield() 方法:
会使的线程放弃当前分得的cpu时间片,但此时线程任然处于可执行状态,随时可以再次分得cpu时间片。yield()方法只能使同优先级的线程有执行的机会。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。(暂停当前正在执行的线程,并执行其他线程,且让出的时间不可知)
//测试yield()方法
class Thread10 implements Runnable{
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+" num= "+i);
if(i==33){
Thread.yield();
}
}
}
}
public static void main(String[] args) {
//测试yield
Thread10 t10 =new Thread10();
Thread t101=new Thread(t10, "包子");
Thread t102=new Thread(t10, "面包");
t101.start();
t102.start();
}
/*
运行结果为:
……
包子 num= 24
包子 num= 25
包子 num= 26
包子 num= 27
包子 num= 28
包子 num= 29
包子 num= 30
包子 num= 31
包子 num= 32
包子 num= 33
面包 num= 0
面包 num= 1
面包 num= 2
面包 num= 3
……
面包 num= 30
面包 num= 31
面包 num= 32
面包 num= 33
包子 num= 34
包子 num= 35
包子 num= 36
包子 num= 37
包子 num= 38
……
*/
(可以看到,当数字为33时,都发生了交替。)
4.wait() 和 notify() 方法:
两个方法搭配使用,wait()使线程进入阻塞状态,调用notify()时,线程进入可执行状态。wait()内可加或不加参数,加参数时是以毫秒为单位,当到了指定时间或调用notify()方法时,进入可执行状态。(属于Object类,而不属于Thread类,wait( )会先释放锁住的对象,然后再执行等待的动作。由于wait( )所等待的对象必须先锁住,因此,它只能用在同步化程序段或者同步化方法内,否则,会抛出异常IllegalMonitorStateException.)
//测试wait()和notify()方法
//用生产者和消费者模式模拟这一过程
/*消费者 */
class Consumer implements Runnable {
private Vector obj;
public Consumer(Vector v) {
this.obj = v;
}
public void run() {
synchronized (obj) {
while (true) {
try {
if (obj.size() == 0) {
obj.wait();
}
System.out.println("消费者:我要买面包。");
System.out.println("面包数: " + obj.size());
obj.clear();
obj.notify();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/* 生产者 */
class Producter implements Runnable {
private Vector obj;
public Producter(Vector v) {
this.obj = v;
}
public void run() {
synchronized (obj) {
while (true) {
try {
if (obj.size() != 0) {
obj.wait();
}
obj.add(new String("面包"));
obj.notify();
System.out.println("生产者:面包做好了。");
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
//测试wait()和notify()
Vector obj = new Vector();
Thread consumer = new Thread(new Consumer(obj));
Thread producter = new Thread(new Producter(obj));
consumer.start();
producter.start();
}
5.join()方法
也叫线程加入。是当前线程A调用另一个线程B的join()方法,当前线程转A入阻塞状态,直到线程B运行结束,线程A才由阻塞状态转为可执行状态。
//测试join
class Thread11 implements Runnable{
@Override
public void run() {
System.out.println("Start Progress.");
try {
for(int i=0;i<5;i++){
System.out.println("Thread11线程 : "+i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("End Progress.");
}
}
public static void main(String[] args) {
//测试join
Thread11 t11=new Thread11();
Thread t111=new Thread(t11);
t111.start();
try {
t111.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("hi,I'm Main线程");
}
/*
运行结果为:
Start Progress.
Thread11线程 : 0
Thread11线程 : 1
Thread11线程 : 2
Thread11线程 : 3
Thread11线程 : 4
End Progress.
hi,I'm Main线程
*/
总结
本文关于Java多线程阻塞与唤醒代码示例的介绍就到这里,希望对大家学习Java有所帮助。感兴趣的朋友可以继续参阅:Java多线程ForkJoinPool实例详解 、 Java通过卖票理解多线程 、 Java线程安全基础概念解析等。有什么问题可以随时留言,或者有什么方面想要了解的,您也可以留言,小编会及时给您答复。希望大家对多多支持!
# java
# 多线程
# 阻塞
# 唤醒
# java多线程
# 示例
# Java多线程中停止线程遇到线程阻塞的处理方法详解
# Java的线程阻塞、中断及优雅退出方法详解
# Java线程阻塞和唤醒的几种方式详解
# Java线程阻塞的方法区别详解
# java调用process线程阻塞问题的解决
# java实现线程阻塞式方法
# 可执行
# 有什么
# 然后再
# 死锁
# 锁住
# 这一
# 才会
# 感兴趣
# 转到
# 而不
# 时间内
# 给您
# 可以看到
# 希望大家
# 会使
# 能使
# 就到
# 用在
# 不加
相关文章:
建站之星备案流程有哪些注意事项?
成都网站制作报价公司,成都工业用气开户费用?
高性价比服务器租赁——企业级配置与24小时运维服务
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
,怎么在广州志愿者网站注册?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
高防服务器租用指南:配置选择与快速部署攻略
建站三合一如何选?哪家性价比更高?
开心动漫网站制作软件下载,十分开心动画为何停播?
简历在线制作网站免费,免费下载个人简历的网站是哪些?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何在建站宝盒中设置产品搜索功能?
如何快速搭建二级域名独立网站?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
已有域名和空间如何快速搭建网站?
简单实现Android文件上传
建站之星官网登录失败?如何快速解决?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
建站主机选购指南:核心配置优化与品牌推荐方案
太平洋网站制作公司,网络用语太平洋是什么意思?
如何获取开源自助建站系统免费下载链接?
如何在腾讯云服务器上快速搭建个人网站?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
建站主机解析:虚拟主机配置与服务器选择指南
网站制作企业,网站的banner和导航栏是指什么?
建站之星logo尺寸如何设置最合适?
股票网站制作软件,网上股票怎么开户?
建站之星收费标准详解:套餐费用及年费价格表一览
青浦网站制作公司有哪些,苹果官网发货地是哪里?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
如何快速生成可下载的建站源码工具?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
,石家庄四十八中学官网?
网站制作说明怎么写,简述网页设计的流程并说明原因?
盘锦网站制作公司,盘锦大洼有多少5G网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
南宁网站建设制作定制,南宁网站建设可以定制吗?
制作网站外包平台,自动化接单网站有哪些?
Java解压缩zip - 解压缩多个文件或文件夹实例
如何在IIS中配置站点IP、端口及主机头?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
在线制作视频网站免费,都有哪些好的动漫网站?
如何在七牛云存储上搭建网站并设置自定义域名?
*请认真填写需求信息,我们会在24小时内与您取得联系。