------- android培训java培训、期待与您交流! ----------

实现多线程对共有数据的同步操作,主要涉及到多线程和同步。

虽然都是基础,但是这把刀还是要用熟练,等到使用的时候才能得心应手。

以下是示例:

 /*
* 需求:有生产者和消费者,生产者生产一个,消费者才能消费一个,但如果消费者不消费,也不能生产。
* 知识点:同步,多线程,等待唤醒机制,单例设计模式。*/
package com.gzjzone.jul242015; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; class ProducerConsumerTest {
public static void main(String[] args) {
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
new Thread(new Producer()).start(); //多生产者。
new Thread(new Consumer()).start(); //多消费者。
} } class Product{
// 单例设计模式:饿汉式。
private Product(){};
private static Product product = new Product();
public static Product getProduct(){
return product;
}
private int pro = 0;
private boolean flag = false; // 同步设置
private Lock lock = new ReentrantLock();
private Condition con_pro = lock.newCondition();
private Condition con_con = lock.newCondition(); public void setPro(int pro){
this.pro = pro;
}
public void setFlag(boolean flag){
this.flag = flag;
}
public int getPro(){
return pro;
}
public boolean getFlag(){
return flag;
}
public Lock getLock(){
return lock;
}
public Condition getCon_pro(){
return con_pro;
}
public Condition getCon_con(){
return con_con;
}
} class Producer implements Runnable {
Product product = Product.getProduct();
Lock lock = product.getLock();
Condition con_pro = product.getCon_pro();
Condition con_con = product.getCon_con();
public void run() {
while (true) {
lock.lock();
try {
// 使用while循环判断标记,可以让线程被唤醒后再次判断while的条件标记。
while (product.getFlag())
con_pro.wait();
int pro = product.getPro();
System.out.println(Thread.currentThread().getName()+"生产..."+(++pro));
product.setPro(pro);
product.setFlag(true);
} catch (InterruptedException e) {
System.out.println("中断异常");
} finally{
con_con.signal();;
lock.unlock();
}
} }
} class Consumer implements Runnable {
Product product = Product.getProduct();
Lock lock = product.getLock();
Condition con_pro = product.getCon_pro();
Condition con_con = product.getCon_con();
public void run() {
while (true) {
lock.lock();
try {
while (!(product.getFlag()))
con_con.wait();
int pro = product.getPro();
System.out.println(Thread.currentThread().getName()+"消费..........."+pro--);
product.setPro(pro);
product.setFlag(false);
} catch (InterruptedException e) {
System.out.println("中断异常");
} finally{
con_pro.signal();
lock.unlock();
}
}
}
}

运行结果为多个线程不断循环生产1个,消费1个,可以看出生产行为和消费行为达到多线程同步,满足需求。

其中关键点:

1.产品是生产者和消费者的共用数据,利用单例设计模式创建产品对象,确认唯一性。
  2.设置标记,通过标记来控制生产消费的次序。

最新文章

  1. 【linux】nohup运行守护进程
  2. 自定义UICollectionViewLayout之瀑布流
  3. ofbiz进击 第四节。 我的form之旅
  4. EasyMock的原理及使用方法
  5. Web中Listener的创建
  6. laravel小抄
  7. JS数据类型转换
  8. [原创].NET 业务框架开发实战之八 业务层Mapping的选择策略
  9. 移动端touch事件封装
  10. ATA接口寄存器描述
  11. 一张图片快速明白Python概述
  12. 干掉windows无脑设定:“始终使用选择的程序打开这种文件”、“使用Web服务查找正确的程序”
  13. DirBuster工具扫描敏感文件
  14. ld命令
  15. hibernate一级缓存和快照
  16. github个人作业
  17. Android 安装 卸载 更新 程序
  18. 关于Unity中的NGUI字体
  19. 判断强联通图中每条边是否只在一个环上(hdu3594)
  20. 'WebElement' object is not iterable

热门文章

  1. 魅族手机(魅蓝note)无法作为调试设备连接到mac问题的解决
  2. c/c++ 对象内存布局
  3. jexus
  4. GBDT基本理论及利用GBDT组合特征的具体方法(收集的资料)
  5. C# 接口应用及意义
  6. notepad++如何设置自动换行
  7. Ubuntu修改hosts方法
  8. HTML速查列表
  9. VS调试在Win7(vista系列)操作系统下 HttpListener拒绝访问解决办法
  10. Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态