黑马程序员_Java基础:实现多线程对共有数据的同步操作
------- 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.设置标记,通过标记来控制生产消费的次序。
黑马程序员_Java基础:实现多线程对共有数据的同步操作的更多相关文章
- 黑马程序员_Java基础:多线程总结
------- android培训.java培训.期待与您交流! ---------- 一.多线程的概念 进程和线程经常会被人混淆,那是因为对它们的概念不明确.就拿我们平时使用的操作系统来说,它是多任 ...
- 黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表
\day01\code\第一章_Java概述.ppt;\day01\resource\资料\50道编程题(有精力的同学看看).doc;\day01\resource\资料\Sun_Java程序员认证考 ...
- 黑马程序员_Java基础:网络编程总结
------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...
- 黑马程序员_Java基础组成
Java语言基础组成 2.1关键字 main不是关键字,但被JVM所识别的名称. 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词. 特点:关键字中所有字母都为小写. 用于定义数据类型的关 ...
- 黑马程序员_Java基础视频-深入浅出精华版--视频列表
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- 黑马程序员_java基础笔记(08)...GUI,网络编程,正则表达式
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— GUI(Graphical User Interface)(图形用户接口):用图形 ...
- 黑马程序员_java基础笔记(04)...多线程
——————————ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— 多线程.第一重点:创建线程的两种方式.第二重点:同步的所有特性 进程:正在执 ...
- 黑马程序员_Java基础:IO流总结
------- android培训.java培训.期待与您交流! ---------- IO流在是java中非常重要,也是应用非常频繁的一种技术.初学者要是能把IO技术的学透,java基础也就能更加牢 ...
随机推荐
- vbs脚本总结
1. msgbox语法:msgbox "对话框","对话框标题" 例:const hw="Hello World!" msgbox(hw) ...
- 第五百八十三天 how can I 坚持
今天去看了个电影,日本动漫,第一次在电影院看日本动漫,<你的名字>,挺经典的.存在爱情吗?什么是爱情,哎.什么是人. 好像有点感冒了呢,说过自己很久没感冒后,往往就会感冒,这到底是怎么回事 ...
- linux部分命令
打包ROOT文件夹tar -cvf ROOT3.tar ./ROOT 解压则相反 ps aux | grep tomcat 直接杀死tomcat sudo kill -9 进程号 rm -rf ./R ...
- android自定义圆形图片和遇到的问题
画圆遇到的问题:图片单位不一样,导致图片只能显示出圆的一部分:看代码: public class MyCircleIamge extends ImageView { private Context c ...
- Javascript调用ActiveX示例
Javascript调用ActiveX示例 写一个ActiveX控件比如叫做MyNameSpace.SecreteInfo,安装在客户机器上,这样可以通过c++获取到机器的几乎任何信息. 在网 ...
- object-assign合并对象
1. Object.assign() 对于合并对象操作, ECMAScript 6 中提供了一个函数: Object.assign(target, source); 这个方法会将所有可枚举 [1] 的 ...
- 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:
移动前端工作的那些事---前端制作之微信小技巧篇 (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...
- phpunit.xml
<phpunit bootstrap="vendor/autoload.php"> <testsuites> <testsuite name=&quo ...
- 未能加载文件或程序集Microsoft.ReportViewer.WebForms, Version=10.0.0.0
解决方案如下ASP.NET项目使用VS2010开发,部署到windows 2008环境中,出现未能加载文件或程序集“Microsoft.ReportViewer.WebForms, Version=1 ...
- JavaScript实例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...