java 多线程 BlockingQueue控制执行进程

package thread;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

/**
 * 现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志
 * 请在程序中增加4个线程去调用parseLog()方法来分头打印这16个日志对象,程序只需要运行4秒即可打印完这些日志对象
 */
public class Thread7Test {
    public static void parseLog(String log) {
        System.out.println(log + ":" + (System.currentTimeMillis() / 1000));
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //定义一个线程共享的队列容器,可以使得数据由队列的一端输入,从另外一端输出
        final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(16);
        //模拟生成日志
        for (int i = 0; i < 16; i++) {
            final String log = "" + (i + 1);
            {
                try {
                    queue.put(log);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        for (int i = 0; i < 4; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (!queue.isEmpty()) {
                        try {
                            parseLog(queue.take());
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
    }

}

 

posted @ 2019-09-12 14:38  wygflying  阅读(100)  评论(0编辑  收藏  举报