-
Java高并发2-线程wait、sleep、yield、notify、join方法总结
一、复习上次连载
-
两个基本单位 -
线程进程的组成 -
程序计数器定义以及执行native方法时是什么 -
三种创建方式:extends Thread 重写run new 实例().start(); implements Runnable 重写run new Thread(new 实例()).start(); implements Callable 重写call(),有返回值 new FutureTask<返回值类型>(new 实例()) new Thread(new FutureTask()).start() FutureTask实例.get() -
关键字native,生成图 -
synchronized(对象){} synchronized void method(变量){} -
synchronized(obj){while(条件不满足){obj.wait()}} 防虚假唤醒
二、wait()方法
1.使用注意点
-
使用wait()方法用于阻塞该线程,该线程获取了对象锁之后,然后调用该对象的wait()方法,就是释放该对象,其他线程可以紧接着调用。 -
一个线程中如果多层获取了对象锁,那么如果释放其中一个或者多个,对其他未释放的对象锁是不会产生影响的。 -
当一个线程调用共享对象的wait()方法被阻塞挂起后,如果其他线程中断了该线程,则该线程会抛出一个InterruptedException异常并返回。
2.带参数的wait()方法
-
wait(long timeout),参数单位为ms,该方法代表线程挂起多少秒后超时返回,除非在此期间会使用notify()或者notifyAll()方法来唤醒线程。wait(0)与wait()方法一致,wait()方法内部实现机制就是wait(0);如果参数是一个负数,那么就会返回一个IllegalArgumentException -
实现wait(long timeout,int nanos)函数
public final void wait(long timeout,int nanos) throws InterruptedException{
if(timeout<0){
throw new IllegalException("timeout value is negative");
}
if(nanos<0 || nanos > 999999){
throw new IllegalException("nanosecond timeout value out of range");
}
if(nanos>0){
timeout++;
}
wait(timeout);
}
三、notify()和notifyAll()函数
-
一个线程调用共享对象的notify()方法之后,会唤醒一个在该共享变量上调用的wait系列方法后被挂起的线程,一个共享变量上可能有多个线程在等待,具体唤醒哪一个等待的线程是随机的。被唤醒的线程不能马上从wait方法返回并继续执行,需要先获得锁,也就是说,被wait()方法挂起的线程必须竞争该锁,获得后才能继续执行。notify()函数就是唤醒所有被挂起的线程
四、join方法
-
该方法用于线程等待,也就说必须这条线程结束之后才能继续下面的语句
五、sleep方法
-
该方法是一个静态方法,使用方法Thread.sleep(秒数),在睡眠期间其他线程调用了interrupt方法的话,该线程会抛出InterruptedException异常。
六、yield方法
package com.ruigege.threadFoundation1;
public class UserYieldMethod implements Runnable{
public UserYieldMethod() {
Thread thread = new Thread(this);
thread.start();
}
@Override
public void run() {
System.out.println("开始一个线程"+Thread.currentThread());
Thread.yield();
System.out.println("结束一个线程"+Thread.currentThread());
}
public static void main(String[] args) {
new UserYieldMethod();
new UserYieldMethod();
new UserYieldMethod();
}
}
-
注释掉Thread.yield() -
这个方法的目的就是让CPU让出自己还没有用完的时间片,让自己的线程处于就绪状态,多用于测试等
1.yield与sleep方法的区别
-
sleep调用线程处于阻塞,挂起状态,等待一定时间后再次恢复 -
yield是让出未用完的时间片,该线程处于就绪状态 -
七、源码:
-
https://github.com/ruigege66/ConcurrentJava
-
CSDN:https://blog.csdn.net/weixin_44630050 -
博客园:https://www.cnblogs.com/ruigege0000/
出 处:https://www.cnblogs.com/ruigege0000/p/13894402.html
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比