多线程的生产者与消费者问题
package com.company;
import java.util.Arrays;
//该类即生产者和消费者的问题,因为pos为对象ss的实例变量,同一个对象pos的值唯一,本例中pos
//当pos的值等于10时,不在增长,并且生产者线程Produser因为write()方法里有wait()方法而被阻塞,
//等消费者线程将数组内容取走时将pose置零,notify()唤醒线程,生产者继续生产
public class ShareArea {
//定义相关变量
private byte data[]=new byte[10]; //缓冲区,长度为10
private int pos=0; //写入位置
//定义一个方法,将数据写入缓冲区,该方法供生产者使用
public synchronized void write(byte value){
//没有轮到生产者就等待
while (pos==10){
try {
wait();
}catch (InterruptedException e){};
}
//notify()写在哪都行,只要在write()方法内,whil循环外都可将线程唤醒
data[pos]=value; //生产者在pos位置写入一个值
notify();
pos++;
}
//定义一个方法充当消费者
public synchronized byte[] read(){
while (pos<10){
try{
wait();
}catch (InterruptedException e){};
}
//pos等于10时复制数组,
byte[] data2= Arrays.copyOf(data,10);
pos=0;
notify();
return data2;
}
//定义main方法
public static void main(String [] args){
ShareArea ss=new ShareArea();
Consumer c=new Consumer(ss);
Produser p=new Produser(ss);
//启动俩个线程
p.start();
c.start();
}
}
//定义生产者,消费者线程
class Consumer extends Thread{
private ShareArea sb;
//获得主类对象
public Consumer(ShareArea s){
sb=s;
}
//定义run方法
public void run(){
for (int i=0;i<10;i++){ //读取数据10次
byte [] value=sb.read();
for (int k=0;k<10;k++){
System.out.println("消费:"+value[k]);
}
}
}
}
//定义生产者类
class Produser extends Thread{
private ShareArea sb;
//获得主类对象
public Produser(ShareArea s){
sb=s;
}
public void run(){
//每次生产100个
for (byte i=0;i<100;i++){
//让线程随机延时
try {
Thread.sleep((int)(Math.random()*1000));
}catch (InterruptedException e){};
sb.write(i);
System.out.println("生产:"+i);
}
}
}
运行结果
生产:0
生产:1
生产:2
生产:3
生产:4
生产:5
生产:6
生产:7
生产:8
生产:9
消费:0
消费:1
消费:2
消费:3
消费:4
消费:5
消费:6
消费:7
消费:8
消费:9
生产:10
生产:11
生产:12
生产:13
生产:14
生产:15
生产:16
生产:17
生产:18
生产:19
消费:10
消费:11
消费:12
消费:13
消费:14
消费:15
消费:16
消费:17
消费:18
消费:19
生产:20
生产:21
生产:22
生产:23
生产:24
生产:25
生产:26
生产:27
生产:28
生产:29
消费:20
消费:21
消费:22
消费:23
消费:24
消费:25
消费:26
消费:27
消费:28
消费:29
生产:30
生产:31
生产:32
生产:33
生产:34
生产:35
生产:36
生产:37
生产:38
生产:39
消费:30
消费:31
消费:32
消费:33
消费:34
消费:35
消费:36
消费:37
消费:38
消费:39
生产:40
生产:41
生产:42
生产:43
生产:44
生产:45
生产:46
生产:47
生产:48
生产:49
消费:40
消费:41
消费:42
消费:43
消费:44
消费:45
消费:46
消费:47
消费:48
消费:49
生产:50
生产:51
生产:52
生产:53
生产:54
生产:55
生产:56
生产:57
生产:58
生产:59
消费:50
消费:51
消费:52
消费:53
消费:54
消费:55
消费:56
消费:57
消费:58
消费:59
生产:60
生产:61
生产:62
生产:63
生产:64
生产:65
生产:66
生产:67
生产:68
生产:69
消费:60
消费:61
消费:62
消费:63
消费:64
消费:65
消费:66
消费:67
消费:68
消费:69
生产:70
生产:71
生产:72
生产:73
生产:74
生产:75
生产:76
生产:77
生产:78
生产:79
消费:70
消费:71
消费:72
消费:73
消费:74
消费:75
消费:76
消费:77
消费:78
消费:79
生产:80
生产:81
生产:82
生产:83
生产:84
生产:85
生产:86
生产:87
生产:88
生产:89
消费:80
消费:81
消费:82
消费:83
消费:84
消费:85
消费:86
消费:87
消费:88
消费:89
生产:90
生产:91
生产:92
生产:93
生产:94
生产:95
生产:96
生产:97
生产:98
生产:99
消费:90
消费:91
消费:92
消费:93
消费:94
消费:95
消费:96
消费:97
消费:98
消费:99
随手写来,如有侵权,联系,删除