基于队列的线程池

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * Created by leizhimin on 2014/8/19.
 */
public class TestThreadPool {
    public static BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(300);

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            queue.add(new TestThread("初始化"));
        }

        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 3, 15, TimeUnit.SECONDS, queue);
        executor.execute(queue.poll());

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    queue.add(new TestThread("生产者"));
                    try {
                        Thread.currentThread().sleep(2000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

class TestThread implements Runnable {
    public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private String name;        //创建者
    private Date addDate;       //添加到队列的日期

    TestThread(String name) {
        this.name = name;
        this.addDate = new Date();
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() +
                ":创建者=" + name + ",创建时间=" + sdf.format(addDate) + ",执行时间=" + sdf.format(new Date()));
        try {
            Thread.currentThread().sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

执行结果:

pool-1-thread-1:创建者=初始化,创建时间=2014-08-20 07:16:49,执行时间=2014-08-20 07:16:49
pool-1-thread-1:创建者=初始化,创建时间=2014-08-20 07:16:49,执行时间=2014-08-20 07:16:50
pool-1-thread-1:创建者=初始化,创建时间=2014-08-20 07:16:49,执行时间=2014-08-20 07:16:51
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:16:49,执行时间=2014-08-20 07:16:52
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:16:51,执行时间=2014-08-20 07:16:53
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:16:53,执行时间=2014-08-20 07:16:54
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:16:55,执行时间=2014-08-20 07:16:55
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:16:57,执行时间=2014-08-20 07:16:57
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:16:59,执行时间=2014-08-20 07:16:59
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:01,执行时间=2014-08-20 07:17:01
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:03,执行时间=2014-08-20 07:17:03
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:05,执行时间=2014-08-20 07:17:05
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:07,执行时间=2014-08-20 07:17:07
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:09,执行时间=2014-08-20 07:17:09
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:11,执行时间=2014-08-20 07:17:11
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:13,执行时间=2014-08-20 07:17:13
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:15,执行时间=2014-08-20 07:17:15
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:17,执行时间=2014-08-20 07:17:17
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:19,执行时间=2014-08-20 07:17:19
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:21,执行时间=2014-08-20 07:17:21
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:23,执行时间=2014-08-20 07:17:23
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:25,执行时间=2014-08-20 07:17:25
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:27,执行时间=2014-08-20 07:17:27
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:29,执行时间=2014-08-20 07:17:29
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:31,执行时间=2014-08-20 07:17:31
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:33,执行时间=2014-08-20 07:17:33
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:35,执行时间=2014-08-20 07:17:35
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:37,执行时间=2014-08-20 07:17:37
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:39,执行时间=2014-08-20 07:17:39
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:41,执行时间=2014-08-20 07:17:41
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:43,执行时间=2014-08-20 07:17:43
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:45,执行时间=2014-08-20 07:17:45
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:47,执行时间=2014-08-20 07:17:47
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:49,执行时间=2014-08-20 07:17:49
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:51,执行时间=2014-08-20 07:17:51
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:53,执行时间=2014-08-20 07:17:53
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:55,执行时间=2014-08-20 07:17:55
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:57,执行时间=2014-08-20 07:17:57
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:17:59,执行时间=2014-08-20 07:17:59
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:01,执行时间=2014-08-20 07:18:01
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:03,执行时间=2014-08-20 07:18:03
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:05,执行时间=2014-08-20 07:18:05
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:07,执行时间=2014-08-20 07:18:07
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:09,执行时间=2014-08-20 07:18:09
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:11,执行时间=2014-08-20 07:18:11
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:13,执行时间=2014-08-20 07:18:13
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:15,执行时间=2014-08-20 07:18:15
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:17,执行时间=2014-08-20 07:18:17
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:19,执行时间=2014-08-20 07:18:19
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:21,执行时间=2014-08-20 07:18:21
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:23,执行时间=2014-08-20 07:18:23
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:25,执行时间=2014-08-20 07:18:25
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:27,执行时间=2014-08-20 07:18:27
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:29,执行时间=2014-08-20 07:18:29
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:31,执行时间=2014-08-20 07:18:31
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:33,执行时间=2014-08-20 07:18:33
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:35,执行时间=2014-08-20 07:18:35
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:37,执行时间=2014-08-20 07:18:37
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:39,执行时间=2014-08-20 07:18:39
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:41,执行时间=2014-08-20 07:18:41
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:43,执行时间=2014-08-20 07:18:43
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:45,执行时间=2014-08-20 07:18:45
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:47,执行时间=2014-08-20 07:18:47
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:49,执行时间=2014-08-20 07:18:49
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:51,执行时间=2014-08-20 07:18:51
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:53,执行时间=2014-08-20 07:18:53
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:55,执行时间=2014-08-20 07:18:55
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:57,执行时间=2014-08-20 07:18:57
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:18:59,执行时间=2014-08-20 07:18:59
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:01,执行时间=2014-08-20 07:19:01
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:03,执行时间=2014-08-20 07:19:03
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:05,执行时间=2014-08-20 07:19:05
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:07,执行时间=2014-08-20 07:19:07
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:09,执行时间=2014-08-20 07:19:09
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:11,执行时间=2014-08-20 07:19:11
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:13,执行时间=2014-08-20 07:19:13
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:15,执行时间=2014-08-20 07:19:15
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:17,执行时间=2014-08-20 07:19:17
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:19,执行时间=2014-08-20 07:19:19
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:21,执行时间=2014-08-20 07:19:21
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:23,执行时间=2014-08-20 07:19:23
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:25,执行时间=2014-08-20 07:19:25
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:27,执行时间=2014-08-20 07:19:27
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:29,执行时间=2014-08-20 07:19:29
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:31,执行时间=2014-08-20 07:19:31
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:33,执行时间=2014-08-20 07:19:33
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:35,执行时间=2014-08-20 07:19:35
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:37,执行时间=2014-08-20 07:19:37
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:39,执行时间=2014-08-20 07:19:39
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:41,执行时间=2014-08-20 07:19:41
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:43,执行时间=2014-08-20 07:19:43
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:45,执行时间=2014-08-20 07:19:45
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:47,执行时间=2014-08-20 07:19:47
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:49,执行时间=2014-08-20 07:19:49
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:51,执行时间=2014-08-20 07:19:51
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:53,执行时间=2014-08-20 07:19:53
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:55,执行时间=2014-08-20 07:19:55
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:57,执行时间=2014-08-20 07:19:57
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:19:59,执行时间=2014-08-20 07:19:59
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:01,执行时间=2014-08-20 07:20:01
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:03,执行时间=2014-08-20 07:20:03
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:05,执行时间=2014-08-20 07:20:05
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:07,执行时间=2014-08-20 07:20:07
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:09,执行时间=2014-08-20 07:20:09
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:11,执行时间=2014-08-20 07:20:11
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:13,执行时间=2014-08-20 07:20:13
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:15,执行时间=2014-08-20 07:20:15
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:17,执行时间=2014-08-20 07:20:17
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:19,执行时间=2014-08-20 07:20:19
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:21,执行时间=2014-08-20 07:20:21
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:23,执行时间=2014-08-20 07:20:23
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:25,执行时间=2014-08-20 07:20:25
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:27,执行时间=2014-08-20 07:20:27
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:29,执行时间=2014-08-20 07:20:29
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:31,执行时间=2014-08-20 07:20:31
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:33,执行时间=2014-08-20 07:20:33
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:35,执行时间=2014-08-20 07:20:35
pool-1-thread-1:创建者=生产者,创建时间=2014-08-20 07:20:37,执行时间=2014-08-20 07:20:37

这个是理想情况,如果生产者创建速度大于消费者速度,则会随着时间推移耗尽系统资源,这个需要通过RejectedExecutionHandler来实现。

基于队列的线程池

时间: 2024-12-15 01:39:41

基于队列的线程池的相关文章

线程进阶之线程队列、线程池和协程

本节目录: 1.线程队列 2.线程池 3.协程 一.线程队列 线程之间的通信我们列表行不行呢,当然行,那么队列和列表有什么区别呢? queue队列 :使用import queue,用法与进程Queue一样 queue is especially useful in threaded programming when information must be exchanged safely between multiple threads. class queue.Queue(maxsize=0)

Java实现锁、公平锁、读写锁、信号量、阻塞队列、线程池等常用并发工具

锁的实现 锁的实现其实很简单,主要使用Java中synchronized关键字. public class Lock { private volatile boolean isLocked = false; private Thread lockingThread = null; public synchronized void lock() throws InterruptedExpection { while(isLocked){ wait(); } isLocked = true; loc

阻塞队列和线程池

一.阻塞队列 1.介绍阻塞队列会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素.当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒). 2.实现ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小.并且可以指定公平性与非公平性,默认情况下为非公平的,即不保证等待时间最长的队列最优先能够访问队列.LinkedBlockingQueue:基于链表实现的一

iOS编程高性能之路-基于pthread的线程池

原文链接--http://blog.sina.com.cn/s/blog_7011f21c0101dkjj.html 在OC的框架中从NSOperation到GCD的dispatch queue到处都充斥着队列的概念,OC的框架帮我们把底层线程的调度都已经写好了,这样的好处是我们可以专心于上层的业务逻辑,坏处当然是我们对底层调度的掌控力变弱了.写这个线程池的原因也是练练手,至于效率如何,在发到线上几个版本后,反馈还可以.当然还有空间可以持续优化. 一.线程池流程 1.在程序启动时创建固定个线程,

基于pthread的线程池实现

最近在做项目的过程中,需要使用线程池来实现任务的异步处理.即线程池中包含提前创建好的线程,客户将任务提交到线程池中,线程池中的线程对任务进行获取并执行.针对项目所使用的pthread线程库,我们设计与实现了一个简单的线程池. 在介绍线程池的实现之前,首先整理一下pthread库的一些接口.pthread是由POSIX提出的线程实现,广泛地被各种unix平台所支持.创建线程的接口为 pthread_create(pthread_t* thread, const pthread_attr_t* at

基于C++11线程池

1.包装线程对象 class task : public std::tr1::enable_shared_from_this<task> { public: task():exit_(false){} task( const task & ) = delete; ~task(){} task & operator =( const task &) = delete; void start(); void stop() { exit_ = true; sync_.noti

用阻塞队列和线程池简单实现生产者和消费者场景

本例子仅仅是博主学习阻塞队列和后的一些小实践,并不是真正的应用场景! 生产者消费者场景是我们应用中最常见的场景,我们可以通过ReentrantLock的Condition和对线程进行wait,notify同通信来实现生产者和消费者场景,前者可以实现多生产者和多消费者模式,后者仅可以实现一生产者,一消费者模式. 今天我们就利用阻塞队列来实现下生产者和消费者模式(里面还利用了线程池). 看过我关于阻塞队列博文的朋友已经知道,阻塞队列其实就是由ReentrantLock实现的! 场景就不描述了,为简单

面试题之使用无界队列的线程池会导致内存飙升吗?

答案:会: 分析: 创建线程池方式有如下几种: Executors.newFixedThreadPool(10);//LinkedBlockingQueue 无限加入队列 Executors.newScheduledThreadPool(10);//DelayedWorkQueue 队列如果满了,阻塞 Executors.newSingleThreadScheduledExecutor();//DelayedWorkQueue 队列如果满了,阻塞 Executors.newCachedThrea

C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型

1.模板类queue,包含头文件<queue>中,是一个FIFO队列. queue.push():在队列尾巴增加数据 queue.pop():移除队列头部数据 queue.font():获取队列头部数据的引用... 2.Qt库的线程池,QThreadPool QThreadPool.setMaxThreadCount():设置线程池最大线程数 QThreadPool.start(new QRunnable(..)):开启线程池调用QRunnable 3.QRunnable执行任务 void r