22.用JAVA中的多线程示例生产者和消费者问题
2012-10-22 14:36
465 查看
//22.用JAVA中的多线程示例生产者和消费者问题
//生产者生产商品,消费者取走商品,
//当商品个数为2时,停止生产,消费者可以消费;
//当商品个数为0时,停止取走, 生产者开始生产
//抽象出三个类,生产者,消费者,商品,商品有商品数量属性,和生产、消费方法
class Procedure implements Runnable{
private Shangpin shangpin;
public Procedure(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
System.out.println("Procedure");
shangpin.procedure();
}
}
class Consume implements Runnable{
private Shangpin shangpin;
public Consume(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
System.out.println("Consume");
shangpin.consume();
}
}
class Shangpin{
private int num;
private boolean flag = true;
public synchronized void consume(){
}
public synchronized void procedure(){
}
}
public class TestPro_Con {
public static void main(String[] args) {
Shangpin shangpin = new Shangpin();
new Thread(new Procedure(shangpin)).start();
new Thread(new Consume(shangpin)).start();
}
} 至此 我先搭好了一个架子,关键就是 Shangpin类的编写,他要生产商品还要消费商品,涉及到线程的很多方面的操作:生产2个时,需要暂停,0个时需要唤醒重新生产。flag用来判断是生产还是消费 package com.softeem.demo;
//22.用JAVA中的多线程示例生产者和消费者问题
//生产者生产商品,消费者取走商品,
//当商品个数为2时,停止生产,消费者可以消费;
//当商品个数为0时,停止取走, 生产者开始生产
//抽象出三个类,生产者,消费者,商品,商品有商品数量属性,和生产、消费方法
//如何实现一边生产一边消费
class Procedure implements Runnable{
private Shangpin shangpin;
public Procedure(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
while(true){
System.out.println("Procedure");
shangpin.procedure();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
class Consume implements Runnable{
private Shangpin shangpin;
public Consume(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
while(true){
System.out.println("Consume");
shangpin.consume();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
class Shangpin{
private int num;
private boolean flag = true;
public synchronized void consume(){
while(!flag){
System.out.println("消费了一个商品");
System.out.println("现在一共有: "+(--num)+" 个商品");
if(this.num <= 0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
}
}
notify();
}
public synchronized void procedure(){
while(flag){
System.out.println("生产了一个商品");
System.out.println("现在一共有: "+(++num)+" 个商品");
if(this.num >= 2){
try {
// Thread.currentThread().wait();
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = false;
}
}
// Thread.currentThread().notify();
notify();
}
}
public class TestPro_Con {
public static void main(String[] args) {
Shangpin shangpin = new Shangpin();
new Thread(new Procedure(shangpin)).start();
new Thread(new Consume(shangpin)).start();
}
}
编写完成后,只能先生产两个再消费两个。。达不到要求,要能实现一边生产一边销售。
我写的可能还有问题请参考下面的程序代码:package com.softeem.demo;
class Producer implements Runnable {
private SyncStack stack;
public Producer(SyncStack stack) {
this.stack = stack;
}
public void run() {
for (int i = 0; i < stack.getProducts().length; i++) {
String product = "产品" + i;
stack.push(product);
System.out.println("生产了: " + product);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private SyncStack stack;
public Consumer(SyncStack stack) {
this.stack = stack;
}
public void run() {
for (int i = 0; i < stack.getProducts().length; i++) {
String product = stack.pop();
System.out.println("消费了: " + product);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class SyncStack {
private String[] products = new String[2];
private int index;
public synchronized void push(String product) {
if (index == product.length()) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
products[index] = product;
index++;
}
public synchronized String pop() {
if (index == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
index--;
String product = products[index];
return product;
}
public String[] getProducts() {
return products;
}
}
public class TestProducerConsumer {
public static void main(String[] args) {
SyncStack stack = new SyncStack();
Producer p = new Producer(stack);
Consumer c = new Consumer(stack);
new Thread(p).start();
new Thread(c).start();
}
}
//生产者生产商品,消费者取走商品,
//当商品个数为2时,停止生产,消费者可以消费;
//当商品个数为0时,停止取走, 生产者开始生产
//抽象出三个类,生产者,消费者,商品,商品有商品数量属性,和生产、消费方法
class Procedure implements Runnable{
private Shangpin shangpin;
public Procedure(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
System.out.println("Procedure");
shangpin.procedure();
}
}
class Consume implements Runnable{
private Shangpin shangpin;
public Consume(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
System.out.println("Consume");
shangpin.consume();
}
}
class Shangpin{
private int num;
private boolean flag = true;
public synchronized void consume(){
}
public synchronized void procedure(){
}
}
public class TestPro_Con {
public static void main(String[] args) {
Shangpin shangpin = new Shangpin();
new Thread(new Procedure(shangpin)).start();
new Thread(new Consume(shangpin)).start();
}
} 至此 我先搭好了一个架子,关键就是 Shangpin类的编写,他要生产商品还要消费商品,涉及到线程的很多方面的操作:生产2个时,需要暂停,0个时需要唤醒重新生产。flag用来判断是生产还是消费 package com.softeem.demo;
//22.用JAVA中的多线程示例生产者和消费者问题
//生产者生产商品,消费者取走商品,
//当商品个数为2时,停止生产,消费者可以消费;
//当商品个数为0时,停止取走, 生产者开始生产
//抽象出三个类,生产者,消费者,商品,商品有商品数量属性,和生产、消费方法
//如何实现一边生产一边消费
class Procedure implements Runnable{
private Shangpin shangpin;
public Procedure(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
while(true){
System.out.println("Procedure");
shangpin.procedure();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
class Consume implements Runnable{
private Shangpin shangpin;
public Consume(Shangpin shangpin){
this.shangpin = shangpin;
}
public void run() {
while(true){
System.out.println("Consume");
shangpin.consume();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
class Shangpin{
private int num;
private boolean flag = true;
public synchronized void consume(){
while(!flag){
System.out.println("消费了一个商品");
System.out.println("现在一共有: "+(--num)+" 个商品");
if(this.num <= 0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
}
}
notify();
}
public synchronized void procedure(){
while(flag){
System.out.println("生产了一个商品");
System.out.println("现在一共有: "+(++num)+" 个商品");
if(this.num >= 2){
try {
// Thread.currentThread().wait();
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = false;
}
}
// Thread.currentThread().notify();
notify();
}
}
public class TestPro_Con {
public static void main(String[] args) {
Shangpin shangpin = new Shangpin();
new Thread(new Procedure(shangpin)).start();
new Thread(new Consume(shangpin)).start();
}
}
编写完成后,只能先生产两个再消费两个。。达不到要求,要能实现一边生产一边销售。
我写的可能还有问题请参考下面的程序代码:package com.softeem.demo;
class Producer implements Runnable {
private SyncStack stack;
public Producer(SyncStack stack) {
this.stack = stack;
}
public void run() {
for (int i = 0; i < stack.getProducts().length; i++) {
String product = "产品" + i;
stack.push(product);
System.out.println("生产了: " + product);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private SyncStack stack;
public Consumer(SyncStack stack) {
this.stack = stack;
}
public void run() {
for (int i = 0; i < stack.getProducts().length; i++) {
String product = stack.pop();
System.out.println("消费了: " + product);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class SyncStack {
private String[] products = new String[2];
private int index;
public synchronized void push(String product) {
if (index == product.length()) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
products[index] = product;
index++;
}
public synchronized String pop() {
if (index == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
notify();
index--;
String product = products[index];
return product;
}
public String[] getProducts() {
return products;
}
}
public class TestProducerConsumer {
public static void main(String[] args) {
SyncStack stack = new SyncStack();
Producer p = new Producer(stack);
Consumer c = new Consumer(stack);
new Thread(p).start();
new Thread(c).start();
}
}
相关文章推荐
- 用JAVA中的多线程示例生产者和消费者问题
- 用JAVA中的多线程示例生产者和消费者问题
- java多线程实现生产者与消费者问题
- Java基础多线程间通讯之多生产者、多消费者模式示例:
- 多线程经典问题之生产者消费者问题的JAVA实现
- java多线程之生产者和消费者经典问题案例
- Java 多线程 生产者与消费者问题测试代码
- java多线程之生产者消费者经典问题
- java多线程总结六:经典生产者消费者问题实现
- java多线程模拟生产者消费者问题,公司面试常常问的题。。。
- 回顾生产者/消费者问题下产生的java多线程(一)
- Java 多线程 生产者消费者问题
- java多线程之生产者消费者经典问题
- java多线程经典的生产者消费者问题
- 黑马程序员-java多线程生产者消费者问题
- java多线程解决生产者消费者问题
- 由生产者/消费者问题看JAVA多线程
- java例程练习(多线程综合练习[生产者-消费者问题])
- java多线程之生产者消费者问题
- java多线程解决生产者消费者问题