该程序多线程基础知识学习的。
实现了1个生产者,1个消费者。当生产者一旦生产了task时,通知消费者(当没有task时,消费者是wait状态),消费立即获取它。
用到的知识点:
1、多线程
2、多线程wait,nofity(notifyAll)。
3、单类模式
生产者接口:
package com.wateray.comsumer;
public interface IProducer extends Runnable {
}
消费者接口:
package com.wateray.comsumer;
public interface IComsumer extends Runnable {
}
生产的产品类:
package com.wateray.comsumer;
import java.util.ArrayList;
import java.util.List;
public class Productor {
private List<String> taskList = new ArrayList<String>(1000);
private static Productor instance = new Productor();
private Productor() {
}
public static Productor getInstance() {
return instance;
}
public void addProduct(String task) {
taskList.add(task);
}
public String getProduct() {
String task = null;
if (!taskList.isEmpty()) {
task = taskList.remove(0);
}
return task;
}
public boolean isEmpty() {
return taskList.isEmpty();
}
}
package com.wateray.comsumer;
public class Producer implements IProducer {
private Productor productor;
private int count;
public Producer(Productor productor) {
this.productor = productor;
}
@Override
public void run() {
while (true) {
count++;
productor.addProduct("task " + count);
System.out.println("Produce new Task, count::" + count);
synchronized (productor) {
try {
productor.notifyAll();
productor.wait((long) (Math.random() + 1) * (5000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
消费者实现类:
package com.wateray.comsumer;
public class Comsumer implements IComsumer {
private Productor productor;
public Comsumer(Productor productor) {
this.productor = productor;
}
@Override
public void run() {
String task = null;
while (true) {
while (productor.isEmpty()) {
synchronized (productor) {
try {
productor.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
task = productor.getProduct();
if (null != task) {
System.out.println("[" + task + "] Comsumed");
}
}
}
}
测试运行类:
/**
*
*/
package com.wateray.comsumer;
/**
* @author lwb
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("begin main");
Productor p = Productor.getInstance();
Thread producerThread = new Thread(new Producer(p));
Thread comsumerThread = new Thread(new Comsumer(p));
// producerThread.setDaemon(true);
comsumerThread.setDaemon(true);
producerThread.start();
comsumerThread.start();
System.out.println("End main");
}
}