首页 > 其他分享 >condition精准控制

condition精准控制

时间:2022-09-28 11:07:42浏览次数:43  
标签:控制 Thread lock void number condition public 精准

Lock版的生产者消费者问题

那么在synchronized中呢,我们是使用wait和notify来控制线程的。

public synchronized void increment() throws InterruptedException {
while (number != 0) {
// 等待
this.wait();100);
number++; // 业务
System.out.println(Thread.currentThread().getName() + " => " + number);
// 通知其它线程我+1加完了
this.notifyAll();

 

用了Lock之后、会有一些细微的改变,wait->condition.await, notify->condition.signal

class doSomething {

private int number = 0;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

// +1
public void increse() throws InterruptedException {
lock.lock();
try {

while (number != 0) {
condition.await();100);
number++;
System.out.println(Thread.currentThread().getName() + "->" +condition.signalAll();catch (Exception e) {
e.printStackTrace();
} finally {

lock.unlock();
}

}


// -1
public void decrese() throws InterruptedException {

lock.lock();
try {
while (number == 0) {
condition.await();100);
number--;
System.out.println(Thread.currentThread().getName() + "->" + number);
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}

}

}

思考:既然有了wait和notify、那为什么我们还要多此一举来使用condition的等待和唤醒呢?

  这是因为condition能够做到有序,精准的通知和唤醒线程

那么如何做到有序精准的来唤醒线程呢?

public class C {
public static void main(String[] args) {
doSomething2 doSomething2 = new doSomething2();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
doSomething2.printA();

}
}, "A").start();

new Thread(() -> {
for (int i = 0; i < 10; i++) {
doSomething2.printB();

}

}, "B").start();

new Thread(() -> {
for (int i = 0; i < 10; i++) {
doSomething2.printC();

}

}, "C").start();

}
}

@SuppressWarnings("all")
class doSomething2 {

private int number = 1;
Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();

public void printA() {
lock.lock();
try {
while (number != 1) {
// 等待
condition1.await();
}
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "AAA");
// 唤醒
condition2.signal();catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void printB() {
lock.lock();
try {
while (number != 1) {
// 等待
condition2.await();
}
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "BBB");
// 唤醒
condition3.signal();catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void printC() {
lock.lock();
try {
while (number != 1) {
// 等待
condition3.await();
}
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + "CCC");
// 唤醒
condition1.signal();catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

}

 

 

 

 

 

 

 

 

 

 

标签:控制,Thread,lock,void,number,condition,public,精准
From: https://blog.51cto.com/u_15810109/5718731

相关文章

  • Lock和Condition(下):Dubbo如何用管程实现异步转同步?
    1)Lock和Condition实现的管程在方法的调用上和sychronized有什么不同?前者用await(),signal(),signalAll()。后者使用wait,notify(),notifiAll();2)本节我们要探究dubbo异步......
  • 显示模块_HDMI/DVI控制器
    一.功能:对VGA控制器输出的RGB数据,行/场同步信号进行TMDS编码,DC平衡处理,分成RGB三个通道和一个同步时钟CLK通道,串行数据输出。二.设计:d_e为高电平时,对RGB数据进......
  • Spring MVC框架:第三章:获取请求参数和页面跳转控制
    获取请求参数1.什么是请求参数?删除姓名:年龄:工资:2.请求参数的四种情况①一名一值<ahref=“emp/remove?empId=3”>删除在handler方法的参数上使用@RequestPar......
  • 分布式版本控制系统Git(概述)
    Git概述1.1版本控制系统概述1.1.1版本控制系统简介版本控制系统(versioncontrolsystem),是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制......
  • 狂神说Java流程控制
    用户交互Scannerscanner对象之前我们学的基本语法中并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的......
  • 流程控制常见例题,归纳总结
    1.根据用户输入内容打印其权限'''jason-->超级管理员tom-->普通管理员jack,rain-->业务主管其他-->普通用户'''代码实现:username=input('username>>>:'......
  • TE二次开发键盘控制键修改
        用键盘可以实现在TE中进行前进、后退等一些操作,这些键是在TE中默认定义好的,在二次开发中,可以实现对这些键进行更换。    默认的键盘操作键列表(帮助文档): ......
  • Java流程控制06(循环结构1)
    while循环do...while循环while循环:while是最基本的循环,它的结构为:while(布尔表达式){//循环内容}只要布尔表达式为true,循环就会一直执行下去我们大多......
  • python流程控制
    python中的流程控制垃圾回收机制1.什么是垃圾回收机制呢? python语言中独有的垃圾回收机制,会自动智能的优化储存空间把没有作用的数据值删除,清除占用的内存空间。2.......
  • python流程控制理论
    今日内容概要垃圾回收机制流程控制理论(重要)流程控制之分支结构(重要)流程控制之循环结构(重要)今日内容详细垃圾回收机制"""有一些语言内存空间的申请和......