Java回炉之多线程(二)生产者与消费者
[toc]
首先有一个资源类Resource
,然后是生产者Producer
和消费者Consumer
,最后再来个用来演示的调用者Demo
。
- Resource.java
public class Resource {
//资源
private String someThing="";
//是否有资源
private boolean hasResource=false;
//放入资源(同步方法)
public synchronized void putThing(String someThing){
//如果有资源,则通知线程等待
if(hasResource){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果没有资源则放入资源并通知线程资源已修改
this.someThing=someThing;
System.out.println("put resource:"+this.someThing);
hasResource=true;
this.notify();
}
//取出资源(同步方法)
public synchronized String getThing(){
//如果没有资源,则通知线程等待
if(!hasResource){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果有资源则取出资源并通知线程资源已修改
hasResource=false;
this.notify();
System.out.println("get resource:"+this.someThing);
return someThing;
}
}
- Producer.java
public class Producer implements Runnable{
//所生产的资源输出到resource
private Resource resource;
public Producer(Resource resource){
this.resource=resource;
}
@Override
public void run() {
//不间断生产资源
while(true){
//使用随机数表示资源
int num=new Random().nextInt();
resource.putThing("number:"+num);
}
}
}
- Consumer.java
public class Consumer implements Runnable{
//所需要测资源从resource获取
private Resource resource;
public Consumer(Resource resource){
this.resource=resource;
}
@Override
public void run() {
//不间断消费资源
while(true){
resource.getThing();
}
}
}
- Main.java
public class Main {
public static void main(String[] args) {
//创建资源存放点
Resource resource =new Resource();
//创建生产者消费者
Producer producer=new Producer(resource);
Consumer consumer=new Consumer(resource);
//分别为生产者和消费者创建线程
Thread producerThread=new Thread(producer);
Thread consumerThread=new Thread(consumer);
//启动两个线程
producerThread.start();
consumerThread.start();
}
}
- 输出显示(截取部分)
put resource:number:-812816298
get resource:number:-812816298
put resource:number:574283090
get resource:number:574283090
put resource:number:748067081
get resource:number:748067081
put resource:number:1548622499
get resource:number:1548622499
put resource:number:-396459528
get resource:number:-396459528
- 查看完成源代码