package com.android.settings;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class BeidouDetailSettingsActivity extends Activity {

private static final String TAG = "BeidouDetailSettingsActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
// BlockingQueue<String> queue = new LinkedBlockingQueue<String>();
// 不设置的话,LinkedBlockingQueue默认大小为Integer.MAX_VALUE

// BlockingQueue<String> queue = new ArrayBlockingQueue<String>(2);

/**
* 模拟处理用户的请求
*/
Consumer consumer = new Consumer(queue);
Producer producer = new Producer(queue);
for (int i = 0; i < 5; i++) {
new Thread(producer, "Producer" + (i + 1)).start();

new Thread(consumer, "Consumer" + (i + 1)).start();

}

}

/**
*
* @author tianxuhong
*
* 原来有种需求: 1. 对于用户的请求都依次的排队,请求需要不定时的完成,对于用户相同的请求则舍弃,必须保证这些请求操作依次完成,
* 如果一次出错则全部放弃后期的操作,对于原来的起一个线程池,如果线程池不空,则操作,线程池是空的则阻塞。后来设计的类似消费者和生产者模型的机制处理。
*
*/

public class Producer implements Runnable {
BlockingQueue<String> queue;

public Producer(BlockingQueue<String> queue) {
this.queue = queue;
}

@Override
public void run() {
try {
String temp = "A Product, 生产线程:"
+ Thread.currentThread().getName();
System.out.println("I have made a product:"
+ Thread.currentThread().getName());
queue.put(temp);// 如果队列是满的话,会阻塞当前线程
/**
* 对于所有的 用户请求加入队列
*/

Log.d(TAG, "Producer=" + temp);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

public class Consumer implements Runnable {
BlockingQueue<String> queue;

public Consumer(BlockingQueue<String> queue) {
this.queue = queue;
}

@Override
public void run() {
try {
String temp = queue.take();// 如果队列为空,会阻塞当前线程
System.out.println(temp);
Log.d(TAG, "Consumer=" + temp);
ConsumerhandleEnable(temp, queue);
Log.d(TAG, "Consumer done>>>>>>>>>>>>>>>>>=" + temp);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

private void ConsumerhandleEnable(String temp, BlockingQueue<String> queue) {
Log.d(TAG, "Consumer handleEnable>>>>>>>>>>>>>>>>>=" + temp);


/**
* send some message
*/
// 在这里处理用户的请求,然后等待请求的结果,如果有则唤醒线程。
synchronized (queue) {
try {
queue.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* check the result
*/

Log.d(TAG, "Consumer handleEnable>>>>>>>>>>>>>>>>>don...");
}

/**
* 设置某种条件去唤醒消费者,即处理后续队列的请求
* @param queue
* @return
*/
private int notification(BlockingQueue<String> queue) {
queue.notify();

return 0;
}

}

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android如何调用webservice 以及错误解决汇总
  3. Android(安卓)6.0+ 需要在运行时请求的权限
  4. Android与Javascript交互示例(三)
  5. 屏幕亮屏、熄屏监听代码
  6. Android手机监控应用(二)
  7. 封装Retrofit,RXJAVA,okhttp网络请求的工具
  8. Application 判断 是否在主进程、主线程
  9. Android在SurfaceView做动画一般方法

随机推荐

  1. 如何在Mac上重置SMC?
  2. 虎虎生威,挑战云上魔方(活动期完成可得实
  3. 介绍一款免费好用的可视化数据库管理工具
  4. 微软被指剽窃他人开源作品!作者被迫终止该
  5. 老司机常用的kafka监控-eagle
  6. 不可不知的zookeeper小工具-zkui
  7. vscode编辑器和markdown/Emmet语法的使用
  8. 接口类和抽象类
  9. 0318作业
  10. [iOS初级教程之二]DeepLink实践