【Java开源代码栏目提醒】:网学会员在Java开源代码频道为大家收集整理了TextProductAndConsume.java提供大家参考,希望对大家有所帮助!
package com.zf.s14;//创建一个包
import java.util.Random;
class Flower {// 缓存数据,用于存与取数据的类(花篮)
private final String[] data;
private int tail; // 下一个放put的地方
private int head; // 下一个放的flower地方
private int count; // 缓存内的鲜花数
public Flower(int count) {// 构造方法进行初始化
this.data = new String[count];// 创建字符串数组
this.head = 0;
this.tail = 0;
this.count = 0;
}
public synchronized void put(String flower) {// 放置鲜花
System.out.println("当前线程" + Thread.currentThread().getName() + "放置鲜花"
+ flower);
try {
while (count >= data.length) {
wait();// 线程等待
}
data[tail] = flower;// 放置鲜花于数组
tail = (tail + 1) % data.length;
count++;
notifyAll();
} catch (Exception e) {// 捕获异常
System.out.println("放置鲜花出现错误:"+e.getMessage());
}
}
public synchronized String take() {// 取出鲜花
String flower = null;
try {
while (count <= 0) {
wait();// 线程等待
}
flower = data[head];//取出指定的鲜花
head = (head + 1) % data.length;
count--;//数组个数减一
notifyAll();
} catch (Exception e) {// 捕获异常
System.out.println("取出鲜花出现错误:"+e.getMessage());
}
System.out.println("当前线程"+Thread.currentThread().getName() + "取出鲜花" + flower);
return flower;
}
}
class ProductThread extends Thread {// 生产者线程类
private final Random random;
private final Flower flower;
private static int id = 0; // 鲜花的流水号
public ProductThread(String name, Flower flower, long seed) {//构造方法进行初始化
super(name);
this.flower = flower;
this.random = new Random(seed);
}
public void run() {//实现Thread类的方法,启动线程
try {
while (true) {
Thread.sleep(random.nextInt(1000));//随机休眠
String flowerID = ",鲜花流水号" + nextId() ;
flower.put(flowerID);//放置鲜花
}
} catch (Exception e) {// 捕获异常
}
}
private static synchronized int nextId() {
return id++;
}
}
class ConsumeThread extends Thread {// 消费者线程类
private final Random random;
private final Flower flower;
public ConsumeThread(String name, Flower flower, long seed) {//构造方法进行初始化
super(name);
this.flower = flower;
this.random = new Random(seed);//创建随机对象
}
public void run() {//实现Thread类的方法,启动线程
try {
while (true) {
String flower = this.flower.take();
Thread.sleep(random.nextInt(1000));
}
} catch (Exception e) {//捕获异常
System.out.println("消费者取出鲜花出错:"+e.getMessage());
}
}
}
public class TextProductAndConsume {// 操作运用多线程实现生产者与消费者的类
public static void main(String[] args) {// java程序主入口处
Flower flower=new Flower(5);// 创建可以放置5朵鲜花的花篮
new ProductThread("ProductThread-1", flower, 001).start();//创建实例启动线程
new ProductThread("ProductThread-2", flower, 002).start();
new ProductThread("ProductThread-3", flower, 003).start();
new ProductThread("ProductThread-4", flower, 004).start();
new ProductThread("ProductThread-5", flower, 005).start();
new ConsumeThread("ConsumeThread-1", flower, 101).start();
new ConsumeThread("ConsumeThread-2", flower, 102).start();
new ConsumeThread("ConsumeThread-3", flower, 103).start();
new ConsumeThread("ConsumeThread-4", flower, 104).start();
new ConsumeThread("ConsumeThread-5", flower, 105).start();
}
}
上一篇:
TextPriorityLevel.java
下一篇:
法律专业开题报告范文