Condition
Condition接口也提供了类似的Object的监视器方法(wait),与Lock配合可以实现等待/通知模式。但是这两者在使用方式以及功能上还是有差别的。
最主要的区别我认为有两个:
1.Condition可以创建多个等待队列,而监视器只能有一个等待队列
2.Condition支持不响应中断
public class ConditionTest02 {
public static Object obj = new Object();
public static Lock lock = new ReentrantLock();
public static Condition cd01 = lock.newCondition();
public static void main(String[] args) throws InterruptedException {
ConditionTest02 test = new ConditionTest02();
Thread thread = new Thread(test::say01);
Thread thread02 = new Thread(test::say02);
Thread thread03 = new Thread(test::say03);
thread.start();
thread02.start();
thread03.start();
// 饿他们5秒钟
Thread.sleep(5000);
// 中断
thread.interrupt();
thread02.interrupt();
// say03会中断失败
thread03.interrupt();
}
/**
* 说:小强饿了
*/
public void say01(){
try{
lock.lock();
System.out.println("小强饿了");
System.out.println("小强等待投食");
cd01.await();
System.out.println("小强吃饱了");
}catch (InterruptedException e){
System.out.println("小强出去觅食了");
}catch (Exception e){
e.printStackTrace();
} finally {
lock.unlock();
}
}
/**
* 说:小明饿了
*/
public void say02(){
try{
synchronized (obj){
System.out.println("小明饿了");
System.out.println("小明等待投食");
obj.wait();
System.out.println("小明吃饱了");
}
} catch (InterruptedException e){
System.out.println("小明出去觅食了");
}
}
/**
* 说:小月鸟饿了 中断无用
*/
public void say03(){
try{
lock.lock();
System.out.println("小月鸟饿了");
System.out.println("小月鸟等待投食");
cd01.awaitUninterruptibly();
System.out.println("小月鸟吃饱了");
}catch (Exception e){
System.out.println("小月鸟出去觅食了");
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
输出结果:
小明饿了
小明等待投食
小强饿了
小强等待投食
小月鸟饿了
小月鸟等待投食
小明出去觅食了
小强出去觅食了
我有一壶酒
足以慰风尘
尽倾江海里
赠饮天下人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用