package com.mdk;
/**
* Created by Administrator on 2018/3/13 0013.
测试类
*/
public class Main {
public static void main(String[] args) {
//声明数据生产者
DataProducer dataProducer = new DataProducer();
//定期生产数据
dataProducer.addData2DataQueue();
//定期唤醒消费者消费数据
ConsumerWakeUp.wakeUp();
}
}
package com.mdk;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Created by Administrator on 2018/3/13 0013.
* 数据队列实体类
*/
public class DataQueue {
private static LinkedBlockingQueue<String> dataQueue = new LinkedBlockingQueue<String>();
public static LinkedBlockingQueue<String> getDataQueue() {
return dataQueue;
}
public static void setDataQueue(LinkedBlockingQueue<String> dataQueue) {
DataQueue.dataQueue = dataQueue;
}
}
package com.mdk;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Created by Administrator on 2018/3/13 0013.
* 数据生产者
*/
public class DataProducer {
//自增量
private static AtomicInteger counter = new AtomicInteger(0);
public static int getCount() {
// 线程安全,以原子方式将当前值加1,注意:这里返回的是自增前的值。
return counter.getAndIncrement();
}
//定期向队列塞入数据
public static void addData2DataQueue() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
try {
for (int i = 0; i < 5; i++) {
Thread.sleep(RandomTest.getRandom() * 1l);
String tmp = getCount() + "";
System.out.println("-----向队列增加任务 " + tmp + "-----");
//添加一个元素,如果队列满,则阻塞
DataQueue.getDataQueue().put(tmp);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 1000, 1000 * 3);
}
}
package com.mdk;
/**
* Created by Administrator on 2018/3/13 0013.
* 数据处理者
*/
public class DataHandler implements Runnable {
@Override
public void run() {
//移除并返问队列头部的元素,如果队列为空则返回null
String data = DataQueue.getDataQueue().poll();
if(data != null) {
System.out.println("处理" + data + "完成");
} else {
System.out.println("队列中没有任务");
}
}
}
package com.mdk;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by Administrator on 2018/3/13 0013.
* 数据消费者
*/
public class DataConsumer {
//数据消费者线程池的最大线程数
private static int threadNum = 5;
//数据消费者线程池
private static ExecutorService fixedThreadPool = Executors.newFixedThreadPool(threadNum);
public static void executeConsum() {
for (int i = 0; i < threadNum; i++) {
fixedThreadPool.execute(new DataHandler());
}
}
}
package com.mdk;
import java.util.Timer;
import java.util.TimerTask;
/**
* Created by Administrator on 2018/3/13 0013.
* 消费者唤醒器
*/
public class ConsumerWakeUp {
//定期唤醒消费者
public static void wakeUp() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-----唤醒消费者-----");
DataConsumer.executeConsum();
}
}, 1000 * 10, 1000 * 5);
}
}
package com.mdk;/** * Created by Administrator on 2018/3/13 0013. 测试类 */public class Main { public static void main(String[] args) { //声明数据生产者 DataProducer dataProducer = ...