首先上代码,android

package com.wmz.helloworld;import java.util.Random;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class Demo extends android.app.Activity {private class Token {private String flag;public Token() {setFlag(null);}public void setFlag(String flag) {this.flag = flag;}public String getFlag() {return flag;}}private Token token = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.demo);Button btn = (Button) findViewById(R.id.button1);token = new Token();if(token.getFlag() ==null)Log.v("A","the token flag value is null");elseLog.v("A","the token flag value is"+token.getFlag());btn.setOnClickListener(new OnClickListener() {public void onClick(View v) {// TODO Auto-generated method stubWorkThread workthread = new WorkThread();workthread.start();Random r=new Random();for (int i = 0;i<10; i++) {try {Thread.sleep((r.nextInt(9)+1)*1000);//增加不确定性,至少睡眠1秒} catch (InterruptedException e) {e.printStackTrace();}synchronized (token) {token.setFlag("wangmz"+Integer.toString(i));token.notifyAll();Log.v("Main",Integer.toString(i));}}}});}  private class WorkThread extends Thread {@Overridepublic void run() {Random r=new Random();while (true) {//try {//Thread.sleep((r.nextInt()+1)*1000);//可能在sleep的时候其他线程执行notify()。但此时对这个线程不起作用。所以结果不会按顺序出现//} catch (InterruptedException e1) {//e1.printStackTrace();//}synchronized (token) {try {token.wait();Log.v("Main", "the value is " + token.getFlag());} catch (InterruptedException e) {e.printStackTrace();}}Log.v("work","while!!");}}}}

c++中实现

std::mutex img_mutex_;std::condition_variable img_cv_;cv::Mat camera::grapPicture(){    std::unique_lock lk(img_mutex_);    img_cv_.wait(lk,[this]{return this->isReady_;});    cv::Mat temp= img_.clone();    std::cout<<"grap picture,img size:"< lk(img_mutex_);            (*capture_)>>img_;            isReady_=true;        }        img_cv_.notify_one();        if(onpreviewcb_)            onpreviewcb_(img_);        //if here don't sleep,this thread will lock img_mutex_ in all most time,and grapPicture will have not chance to grap image        std::this_thread::sleep_for(std::chrono::milliseconds(10));    }    std::cout<<"camera:work_loop end"<

可以看到,两者基本是一样的,消费者首先要获得同步锁,然后wait(wait内部会释放同步锁),生产者这时候获得同步锁,生产数据,notify,释放同步锁(如果不释放,消费者是无法执行的),这时候消费者在wait处又可以开始执行了。

更多相关文章

  1. android使用retrofit
  2. Android和PC端通过局域网文件同步
  3. Android网络时间同步
  4. 在Android中实现多线程同步
  5. Most Popular Android(安卓)Downloads Of 2012
  6. Android应用程序的Java数据更新和UI同步改变
  7. Android内核的简单分析
  8. android图片优化,内存释放处理
  9. android弹钢琴的一个简单程序

随机推荐

  1. 【Android(安卓)Developers Training】 1
  2. Android文件系统的制作
  3. 代码方法android全屏显示
  4. 录音函数网络对讲机C#服务器 Android客户
  5. [Android源码]Android源码之高仿飞鸽传书
  6. android开发音乐播放器之进度条
  7. NDK 在 Android(安卓)studio如何使用(Andr
  8. Android(安卓)Developers:拖动和缩放
  9. Android(安卓)Studio 3.3.2 正式版的安装
  10. Android(安卓)OkHttp4 RequestBody.creat