线程安全的数据队列 LinkedBlockingQueue Demo

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值