精华内容
下载资源
问答
  • Condition

    千次阅读 2018-02-15 17:49:39
    在上一篇博客《生产者消费者模式之Lock与Condition》中已经对Condition的使用有所了解了,下面再举一个之前在网上看过的例子作为Condition的补充。 问题:假设有三个线程,一个主线程mainThread和两个子线程...

           在上一篇博客《生产者消费者模式之LockCondition中已经对Condition的使用有所了解了,下面再举一个之前在网上看过的例子作为Condition的补充。

     

        问题:假设有三个线程,一个主线程mainThread和两个子线程subThread1、subThread2,要求按顺序输出,mainThread先输出1——3,然后subThread1输出4——6,最后subThread2输出7——9,循环执行。


        问题分析:有三个线程要顺序执行,所以我们可以定义三个Condition分别表示这三个线程,然后定义一个判断标记flagflag==0表示mainThreadflag==1表示subThread1flag==2表示subThread2。


    package com.gk.thread.condition.demo;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    
    public class ConditionDemo {
    	
    	private static int count = 1;
    	
    	private Lock lock = new ReentrantLock();
    	private Condition mainCondition = lock.newCondition();
    	private Condition subCondition1 = lock.newCondition();
    	private Condition subCondition2 = lock.newCondition();
    	
    	/*
    	 * flag = 0代表mainCondition
    	 * flag = 1代表subCondition1
    	 * flag = 2代表subCondition2
    	 */
    	private int flag = 0;
    	
    	/**
    	 * mainThread线程调的方法
    	 */
    	public void mainThread() {
    			
    		lock.lock();
    		try {
    			while(flag != 0) {	
    				mainCondition.await();	// 如果flag != 0,mainThread线程等待
    			}
    			
    			// 如果flag == 0,mainThread线程往下执行
    			System.out.println("第" + count++ + "次输出");
    			for(int i=1; i<=3; i++) {
    				System.out.println("mainThread : " + i);
    			}
    			System.out.println();
    			
    			// 修改flag = 1,并唤醒subCondition1执行
    			flag = 1;		
    			subCondition1.signal();
    			
    		} catch (InterruptedException e) {
    			throw new RuntimeException(e);
    		}finally {
    			
    			lock.unlock();
    		}
    	}
    		
    	/**
    	 * subThread1线程调的方法
    	 */
    	public void subThread1() {
    			
    		lock.lock();
    			
    		try {
    			while(flag != 1) {
    				subCondition1.await();
    			}
    			
    			for(int i=4; i<=6; i++) {
    				System.out.println("subThread1 : " + i);
    			}
    			System.out.println();
    			
    			flag = 2;
    			subCondition2.signal();
    				
    		} catch (InterruptedException e) {
    			throw new RuntimeException(e);
    		}finally {
    			lock.unlock();
    		}
    	}
    
    	/**
    	 * subThread2线程调的方法
    	 */
    	public void subThread2() {
    			
    		lock.lock();
    			
    		try {
    			while(flag != 2) {
    				subCondition2.await();
    			}
    				
    			for(int i=7; i<=9; i++) {
    				System.out.println("subThread2 : " + i);
    			}
    			
    			System.out.println("\n=======================\n");
    			flag = 0;
    			mainCondition.signal();
    		} catch (InterruptedException e) {
    			throw new RuntimeException(e);
    		}finally {
    			lock.unlock();
    		}
    	
    	}
    		
    }


        测试代码:


    package com.gk.thread.condition.demo;
    
    public class Test {
    	
    	public static void main(String[] args) {
    		
    		final int COUNT = 3;
    		ConditionDemo cd = new ConditionDemo();
    		
    		for (int i=1; i<=COUNT; i++) {
    			
    			new Thread(new Runnable() {
    				
    				@Override
    				public void run() {
    					
    					cd.mainThread();	// mainThread线程
    				}	
    			}).start();
    			
    			new Thread(new Runnable() {
    				
    				@Override
    				public void run() {
    					
    					cd.subThread1();	// subThread1线程
    				}
    			}).start();
    
    			new Thread(new Runnable() {
    				
    				@Override
    				public void run() {
    					
    					cd.subThread2();	// subThread2线程
    				}
    			}).start();
    			
    		}
    	}
    
    }


        最后再友情提示一句:在API中有Condition实现阻塞队列的示例,读者可以体会其中算法思想。



     

        

    展开全文
  • Condition接口

    千次阅读 2021-02-22 15:35:54
    Condition接口 Condition是j.u.c包下提供的一个接口。可以翻译成 条件对象,其作用是线程先等待,当外部满足某一条件时,在通过条件对象唤醒等待的线程。 void await() throws InterruptedException;让线程进入等待...

    Condition接口

    Condition是j.u.c包下提供的一个接口。可以翻译成 条件对象,其作用是线程先等待,当外部满足某一条件时,在通过条件对象唤醒等待的线程。

    void await() throws InterruptedException;让线程进入等待,如果其他线程调用同一Condition对象的notify/notifyAll,那么等待的线程可能被唤醒。释放掉锁

    void signal();唤醒等待的线程

    void signalAll();唤醒所有线程

    练习题:

    写2个线程,其中一个打印1-52,另一个打印a-z,打印顺序应该是12a34b56c……5152

    • 线程1执行2次数后,线程2执行1次输出

      public class T1 {
      private static final Lock lock = new ReentrantLock();
      private static final Condition conNum = lock.newCondition();
      private static final Condition conChar = lock.newCondition();
      private boolean flag = false;

        public void printNum() {
        	try {
        		lock.lock();
        		for (int i = 1; i <= 52; i++) {
        			while (flag)
        				try {
        					conNum.await();
        				} catch (InterruptedException e) {
        					e.printStackTrace();
        				}
        			System.out.print(i);
        			if (i % 2 == 0) {
        				flag = !flag;
        				conChar.signal();
        			}
        		}
        	} finally {
        		lock.unlock();
        	}
        }
      
        public void printChar() {
        	try {
        		lock.lock();
        		for (int i = 'a'; i <= 'z'; i++) {
        			while (!flag)
        				try {
        					conChar.await();
        				} catch (InterruptedException e) {
        					e.printStackTrace();
        				}
        			System.out.print((char)i);
        				flag = !flag;
        				conNum.signal();
        		}
        	} finally {
        		lock.unlock();
        	}
        }
        public static void main(String[] args) {
        	T1 tt=new T1();
        	new Thread(()->{
        		tt.printNum();
        	}).start();
        	new Thread(()->{
        		tt.printChar();
        	}).start();
        }
      

      }

    使用Condition的特殊点:

    • 当调用condition.await()阻塞线程时会自动释放锁,不管调用了多少次lock.lock(),这时阻塞在lock.lock()方法上线程则可以获取锁
    • 当调用condition.signal()唤醒线程时会继续上次阻塞的位置继续执行,默认会自动重新获取锁(注意和阻塞时获取锁的次数一致)
    展开全文
  • private Condition condition; public ConditionDemoWait(Lock lock, Condition condition){ this.lock=lock; this.condition=condition; } @Override public void run() { S.
    public class ConditionDemoWait implements Runnable{ 
    	private Lock lock;
    	private Condition condition; 
    	public ConditionDemoWait(Lock lock, 
    	Condition condition){ 
    		this.lock=lock; 
    		this.condition=condition; 
    	} 
    	@Override 
    	public void run() { 
    		System.out.println("begin -	ConditionDemoWait"); 
    		try { 
    			lock.lock(); 
    			condition.await(); 
    			System.out.println("end - ConditionDemoWait"); 
    		} catch (InterruptedException e) { 
    			e.printStackTrace(); 
    		}finally { 
    			lock.unlock(); 
    		}
    	 } 
    }

     

    展开全文
  • Condition用法

    千次阅读 2019-06-25 11:28:18
    Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能。 代码 Condition condition = lock.newCondition(); res. condition.await(); 类似wait res. Condition. Signal() 类似notify ...

    Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能。
    代码
    Condition condition = lock.newCondition();
    res. condition.await(); 类似wait
    res. Condition. Signal() 类似notify

    class Res {
    public String userName;
    public String sex;
    public boolean flag = false;
    Lock lock = new ReentrantLock();
    }

    class InputThread extends Thread {
    private Res res;
    Condition newCondition;
    public InputThread(Res res, Condition newCondition) {
    this.res = res;
    this.newCondition=newCondition;
    }

    @Override
    public void run() {
    	int count = 0;
    	while (true) {
    		// synchronized (res) {
    
    		try {
    			res.lock.lock();
    			if (res.flag) {
    				try {
    

    // res.wait();
    newCondition.await();
    } catch (Exception e) {
    // TODO: handle exception
    }
    }
    if (count == 0) {
    res.userName = “余胜军”;
    res.sex = “男”;
    } else {
    res.userName = “小红”;
    res.sex = “女”;
    }
    count = (count + 1) % 2;
    res.flag = true;
    // res.notify();
    newCondition.signal();
    } catch (Exception e) {
    // TODO: handle exception
    }finally {
    res.lock.unlock();
    }
    }

    	// }
    }
    

    }

    class OutThrad extends Thread {
    private Res res;
    private Condition newCondition;
    public OutThrad(Res res,Condition newCondition) {
    this.res = res;
    this.newCondition=newCondition;
    }

    @Override
    public void run() {
    	while (true) {
    

    // synchronized (res) {
    try {
    res.lock.lock();
    if (!res.flag) {
    try {
    // res.wait();
    newCondition.await();
    } catch (Exception e) {
    // TODO: handle exception
    }
    }
    System.out.println(res.userName + “,” + res.sex);
    res.flag = false;
    // res.notify();
    newCondition.signal();
    } catch (Exception e) {
    // TODO: handle exception
    }finally {
    res.lock.unlock();
    }
    // }
    }

    }
    

    }

    public class ThreadDemo01 {

    public static void main(String[] args) {
    	Res res = new Res();
    	Condition newCondition = res.lock.newCondition();
    	InputThread inputThread = new InputThread(res,newCondition);
    	OutThrad outThrad = new OutThrad(res,newCondition);
    	inputThread.start();
    	outThrad.start();
    }
    

    }

    展开全文
  • Condition使用

    2019-07-23 21:33:13
    Condition Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和...
  • Condition详解

    2020-07-22 14:09:21
    Condition详解 传统上,我们可以同个synchronized关键字 + wait + notify/notifyAll 来实现多个线程之间的协调与通信,整个过程都是由JVM来帮助我们实现的;开发者无需(也无法)了解底层的细节。 从JDK 1.5开始,并...
  • 认识Condition

    2020-03-22 16:06:55
    今天我们来学习一下Condition(身份)Condition是在Java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种...
  • 今天在写网站的时候同一个条件需要对比多个值,框架是thinkphp的查了下资料发现是可以判断的,接下来吾爱编程就为大家介绍一下thinkphp中if标签的condition用法,有需要的小伙伴可以参考一下:1、condition语法介绍...
  • Spring Condition

    2018-06-08 15:04:01
    Conditional 和 Condition Spring boot 的 Conditional注解 用来判断是否应该注册指定的组件,Conditional需要与Condition接口配合使用。使用方式是在配置类或者方法上添加如下注解,如果满足 XxxCondition的...
  • Condition源码分析

    千次阅读 2018-07-20 16:08:54
    Condition接口 概述 condition与Lock的实现类结合使用。 如果Lock替换了synchronized方法和语句的使用,则Condition将替换Object监视方法(wait,notify和notifyAll)的使用。 condition,也称为condition queue...
  • Condition Variables

    2015-07-09 14:00:55
    Condition Variables Condition variables are synchronization primitives that enable threads to wait until a particular condition occurs. Condition variables are user-mode objects that cannot be share
  • Race condition

    千次阅读 2018-08-05 13:14:20
    在很多门课上都接触到race condition, 其中也举了很多方法解决这个问题。于是想来总结一下这些方法。 Race condition 它旨在描述一个系统或者进程的输出依赖于不受控制的事件出现顺序或者出现时机。此词源自于两...
  • Condition接口详解

    2020-06-05 17:55:50
    一、condition和对象监视器 Condition是对象监视器的替代品,拓展了监视器的语义。...Condition对象: Condition.await()、Condition.awaitNanos(long nanosTimeout)、Condition.signal()、Condition.signalA
  • mybatis Condition查询

    2019-09-24 03:26:34
    Condition condition = new Condition(ACurrentTotal.class); condition.createCriteria().andCondition("s_date = '" + TODAY() + "'"); condition.createCriteria().andCondition("floor = '" + floor + ...
  • JUC-Condition使用以及Condition原理分析

    千次阅读 2019-05-24 22:03:01
    ps:要想理解Condition原理,需要先了解AQS,不了解AQS的可以看先之前的文章->aqs源码解析 在Synchronized加锁状态时,是使用wait/notify/notifyAll进行线程间的通信。那么在使用ReentrantLock加锁时,是如何实现...
  • Python condition

    千次阅读 2016-05-10 23:27:17
    Python提供的Condition对象提供了对复杂线程同步问题的支持。Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。...
  • Condition实现等待/通知模式

    千次阅读 多人点赞 2020-07-27 13:59:09
    Condition实现等待/通知模式 Condition接口提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的。Object和Condition接口的一些对比。 void await():...
  • condition_variable

    2019-03-09 17:37:35
    相关的类包括 std::condition_variable和 std::condition_variable_any,还有枚举类型std::cv_status。另外还包括函数 std::notify_all_at_thread_exit(),下面分别介绍一下以上几种类型。 std::condition_...
  • ant condition

    2015-06-19 13:57:11
    condition的基本元素有10个左右,下面列出两个测试的例子: [html] view plaincopyprint? xml version="1.0" encoding="GB2312"?>  project basedir="." name="test1" default="condition_istrue...
  • java Condition

    千次阅读 2013-02-26 19:14:52
    Condition的基本使用如下: * Condition是个接口,基本的方法就是await()和signal()方法; * Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition() * 调用Condition的await()和signal()...
  • boost condition

    千次阅读 2014-07-06 09:56:32
    condition是一个简单的同步对象,用于使一个线程等待一个特定的条件成立(比如 资源可用)。一个condition对象总是和一个mutex对象配合使用。mutex在交给condition 对象的wait系列函数时,必须已经通过lock对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,228
精华内容 27,691
热门标签
关键字:

condition