java线程(生产者/消费者)
2015-12-19 10:25
351 查看
import
java.util.ArrayList;
import
java.util.List;
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 消费者/生产者模式 问题:[/align]
[align=left] * 1.一个共同容量确定的仓库,[/align]
[align=left] * 2.生产者只管生产物品放到仓库,若仓库库满则等待,若库未满,继续生产放入,[/align]
[align=left] * 3.消费者只管从仓库区物品,若库空则等待,若库未空,则取[/align]
[align=left] * 4.消费者和生产者,相互不关联[/align]
[align=left] *[/align]
[align=left] * 代码: 1.创建物品类 2.容量一定的仓库类(存取) 3.消费者类(继承Thread) 4.生产者类(继承Thread)[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left]
[/align]
[align=left]// 物品类[/align]
class
Goods {
public
int
id;
public
Goods(){};
public
Goods(int
id) {
this.
id=
id;
[align=left] }[/align]
[align=left]
[/align]
public
String toString() {
return
"goods"
+
id;
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]// 仓库(物品类)[/align]
class
Store {
[align=left] //用于存放goods的集合[/align]
private
Goods[]
lst=
new
Goods[5];
int
index=0;
[align=left] //仓库容量的确定[/align]
[align=left] //放[/align]
public
synchronized
void
put(Goods
goods) {
System.
out.println(
"put"+
goods.
id);
while(
index==
lst.
length){
try
{
this.wait();
}
catch
(InterruptedException
e) {
//
TODO
Auto-generated catch block
e.printStackTrace();
[align=left] } [/align]
[align=left] }[/align]
this.notify();
lst[
index]=
goods;
index++;
[align=left] }[/align]
[align=left] //取[/align]
public
synchronized
Goods take(){
while(
index==0){
try
{
this.wait();
}
catch
(InterruptedException
e) {
//
TODO
Auto-generated catch block
e.printStackTrace();
[align=left] }[/align]
[align=left] }[/align]
index--;
this.notify();
return
lst[
index];
[align=left] [/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]//生产者[/align]
class
Producer
extends
Thread{
private
Store
store;
public
void
setStore(Store
store){
this.
store=
store;
[align=left] }[/align]
[align=left] @Override[/align]
public
void
run() {
//生产物品
for(
int
i=0;
i<30;
i++){
Goods
g=
new
Goods(
i);
store.put(
g);
[align=left] } [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]//消费者[/align]
class
Consumer
extends
Thread {
private
Store
store;
public
void
setStore(Store
store){
this.
store=
store;
[align=left] }[/align]
[align=left] @Override[/align]
public
void
run() {
[align=left] [/align]
for(
int
i=0;
i<30;
i++){
[align=left]
[/align]
System.
out.println(
"take"+
store.take().
id);
[align=left] [/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
//测试
[align=left]class ProduceConsume {[/align]
[align=left] [/align]
[align=left] [/align]
public
static
void
main(String[]
args) {
Store
store=
new
Store();
Producer
producer=
new
Producer();
Consumer
consumer=
new
Consumer();
producer.setStore(
store);
consumer.setStore(
store);
producer.start();
consumer.start();
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
java.util.ArrayList;
import
java.util.List;
[align=left]
[/align]
[align=left]/**[/align]
[align=left] * 消费者/生产者模式 问题:[/align]
[align=left] * 1.一个共同容量确定的仓库,[/align]
[align=left] * 2.生产者只管生产物品放到仓库,若仓库库满则等待,若库未满,继续生产放入,[/align]
[align=left] * 3.消费者只管从仓库区物品,若库空则等待,若库未空,则取[/align]
[align=left] * 4.消费者和生产者,相互不关联[/align]
[align=left] *[/align]
[align=left] * 代码: 1.创建物品类 2.容量一定的仓库类(存取) 3.消费者类(继承Thread) 4.生产者类(继承Thread)[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left]
[/align]
[align=left]// 物品类[/align]
class
Goods {
public
int
id;
public
Goods(){};
public
Goods(int
id) {
this.
id=
id;
[align=left] }[/align]
[align=left]
[/align]
public
String toString() {
return
"goods"
+
id;
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]// 仓库(物品类)[/align]
class
Store {
[align=left] //用于存放goods的集合[/align]
private
Goods[]
lst=
new
Goods[5];
int
index=0;
[align=left] //仓库容量的确定[/align]
[align=left] //放[/align]
public
synchronized
void
put(Goods
goods) {
System.
out.println(
"put"+
goods.
id);
while(
index==
lst.
length){
try
{
this.wait();
}
catch
(InterruptedException
e) {
//
TODO
Auto-generated catch block
e.printStackTrace();
[align=left] } [/align]
[align=left] }[/align]
this.notify();
lst[
index]=
goods;
index++;
[align=left] }[/align]
[align=left] //取[/align]
public
synchronized
Goods take(){
while(
index==0){
try
{
this.wait();
}
catch
(InterruptedException
e) {
//
TODO
Auto-generated catch block
e.printStackTrace();
[align=left] }[/align]
[align=left] }[/align]
index--;
this.notify();
return
lst[
index];
[align=left] [/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]//生产者[/align]
class
Producer
extends
Thread{
private
Store
store;
public
void
setStore(Store
store){
this.
store=
store;
[align=left] }[/align]
[align=left] @Override[/align]
public
void
run() {
//生产物品
for(
int
i=0;
i<30;
i++){
Goods
g=
new
Goods(
i);
store.put(
g);
[align=left] } [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]//消费者[/align]
class
Consumer
extends
Thread {
private
Store
store;
public
void
setStore(Store
store){
this.
store=
store;
[align=left] }[/align]
[align=left] @Override[/align]
public
void
run() {
[align=left] [/align]
for(
int
i=0;
i<30;
i++){
[align=left]
[/align]
System.
out.println(
"take"+
store.take().
id);
[align=left] [/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
//测试
[align=left]class ProduceConsume {[/align]
[align=left] [/align]
[align=left] [/align]
public
static
void
main(String[]
args) {
Store
store=
new
Store();
Producer
producer=
new
Producer();
Consumer
consumer=
new
Consumer();
producer.setStore(
store);
consumer.setStore(
store);
producer.start();
consumer.start();
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树