java阻塞队列使用实例

package threadpool;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by jl on 2016/10/17.
 * 测试阻塞队列的使用(模拟有200个文件需要处理,由一个读线程去将文件加载到容量为100的阻塞队列,由四个写线程去进行文件处理)
 */
public class TestBlockingQueue {
    // 能容纳100个文件
    static final BlockingQueue<String> queue = new LinkedBlockingDeque<>(100);
    //读个数
    static final AtomicInteger rc = new AtomicInteger();
    //写个数
    static final AtomicInteger wc = new AtomicInteger();

    static long randomTime() {
        return (long) (Math.random() * 1000);
    }

    private static void scanFile(String name) {

        try {
            for (int i = 0; i < 200; i++) {
                queue.put("file" + i);
            }
            queue.put("");//放置结束标置
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static void writeFile() {
        while (true) {
            try {
                Thread.sleep(randomTime());
                int index = wc.incrementAndGet();
                String name = queue.take();
                System.out.println(Thread.currentThread() + "=》" + name + "写操作完成,已完成:" + index);
                //队列已经无对象
                if ("".equals(name)) {
                    // 再次添加”标志”,以让其他线程正常退出
                    queue.put("");
                    break;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {

        //线程池
        final ExecutorService exec = Executors.newFixedThreadPool(5);


        Runnable read = new Runnable() {
            @Override
            public void run() {
                scanFile("noNeed");
            }
        };
        Runnable write = new Runnable() {
            @Override
            public void run() {
                writeFile();
            }
        };

        //从线程池起一个读线程
        exec.submit(read);
        //从线程池起四个写线程
        for (int i = 0; i < 4; i++) {
            exec.submit(write);
        }
        exec.shutdown();
    }

}

猜你喜欢

转载自blog.csdn.net/wo327865/article/details/52840456