本文是模拟生产者与消费者的示例
package com.zhang.demo;
//主类
public class Threadall {
public static void main(String[] args) {
ShareData sd = new ShareData();
new Consumer(sd).start();
new Producer(sd).start();
}
}
//共享数据类
class MyData{
//可以拓展,表达复杂的数据类
public int data;
}
//共享数据控制类
class ShareData {
//共享数据
private MyData data;
//通知变量
private boolean writeable = true;
public synchronized void setShareData(MyData data){
if (!writeable){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.data=data;
//标记已经生产
writeable=false;
//通知消费者已经生产,可以开始消费
notify();
}
public synchronized MyData getShareData(){
if (writeable){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//标记已经消费
writeable=true;
//通知需要生产
notify();
return this.data;
}
}
//生产者线程
class Producer extends Thread{
private ShareData sd;
Producer(ShareData sd ) {
this .sd =sd;
}
public void run() {
for (int i = 1; i <= 10; i++) {
try {
Thread.sleep((int)Math.random()*100);
} catch (InterruptedException e) {
}
MyData myData = new MyData();
myData.data=i;
sd.setShareData(myData);
System.out.println("生产者产生一条数据:"+myData.data+".");
}
}
}
class Consumer extends Thread{
private ShareData sd;
Consumer(ShareData sd ) {
this .sd =sd;
}
public void run() {
MyData mydata;
do {
try {
Thread.sleep((int) Math.random() * 100);
} catch (InterruptedException e) {
}
mydata = sd.getShareData();
System.out.println("消费者消费一条数据:" + mydata.data + ".");
}while (mydata.data<=10);
}
}
以上代码编译运行的结果如下:
消费者消费一条数据:1.
生产者产生一条数据:1.
生产者产生一条数据:2.
消费者消费一条数据:2.
生产者产生一条数据:3.
消费者消费一条数据:3.
生产者产生一条数据:4.
消费者消费一条数据:4.
消费者消费一条数据:5.
生产者产生一条数据:5.
生产者产生一条数据:6.
消费者消费一条数据:6.
生产者产生一条数据:7.
消费者消费一条数据:7.
生产者产生一条数据:8.
消费者消费一条数据:8.
生产者产生一条数据:9.
消费者消费一条数据:9.
生产者产生一条数据:10.
消费者消费一条数据:10.