- 浏览: 517134 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (268)
- C/C++ (5)
- LUA (0)
- JVM (6)
- UML (1)
- J2SE (43)
- J2EE (15)
- EXTJS (1)
- HTML5 (47)
- ANDROID (2)
- JAVASCRIPT (51)
- WEB SERVICES (0)
- 数据库 (2)
- 数据结构 (0)
- 应用服务器 (11)
- 设计模式应用 (0)
- JAVA性能与缓存 (1)
- ByteCode (5)
- RCP (0)
- Plugin (0)
- Eclipse (3)
- 程序人生 (14)
- Mobile (2)
- Linux/Ubuntu (31)
- sublime (2)
- python (15)
- Git (5)
- NodeJs (3)
- Crosswalk (1)
- Browserify (1)
- Backbone (1)
最新评论
其实线程池的实现就是生产者消费者问题 的实现,理解了生产者消费者问题 就不会对线程池的实现感到神秘了,线程池在很多地方会用到,比如 tomcat 等各种中间容器的实现, Spring 对线程池的支持等,当然 mina 中也使用到了线程池的概念。
看下简单对线程池的实现代码,主要包括三个类,一个是线程池,一个是工作任务,一个是客户端进行任务添加。
任务类,比较简单,实现 Runnable 接口:
//任务类,具体要执行的操作 public class Worker implements Runnable { private int id; public Worker(int id) { this.id = id; } public void run() { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程:" + Thread.currentThread().getName() + " 执行任务" + id); } }
线程池,相对复杂一些,但是原理是很简单的:
public class ThreadPool { // 线程池大小 private final int nThreads; // 线程池工作者(具体线程) private final PoolWorker[] threads; // 任务队列 private final LinkedList<Runnable> queue; public ThreadPool(int nThreads) { // 初始线程池,并启动线程池里面的线程 this.nThreads = nThreads; queue = new LinkedList<Runnable>(); threads = new PoolWorker[nThreads]; for (int i = 0; i < nThreads; i++) { threads[i] = new PoolWorker(); threads[i].start(); } } // 提交工作任务,实际将任务放入队列,并通知线程进行消费 public void execute(Runnable r) { synchronized (queue) { queue.addLast(r); queue.notify(); } } private class PoolWorker extends Thread { public void run() { Runnable r; // 循环取出任务队列里的任务进行消费,如果没有任务,就等待任务到来。 while (true) { synchronized (queue) { while (queue.isEmpty()) { try { queue.wait(); } catch (InterruptedException ignored) { } } r = queue.removeFirst(); } try { r.run(); } catch (RuntimeException e) { } } } } }
客户端代码:
public class Client { public static void main(String[] args) { ThreadPool queue = new ThreadPool(10); // 提交工作任务。 queue.execute(new Worker(1)); queue.execute(new Worker(2)); queue.execute(new Worker(3)); } }
线程池实现其实比较简单的,但是实际应用中我们用线程池比较常见的方式还是使用 JDK 中对线程池的实现,它提供了 ExecutorService , Executor 等类实现了对线程池的支持,不过线程池的实现原理其实是和我们的一样的,只不过它更多的考虑了实现细节,功能更强一些,关于它的使用网上有很多文章讲的已经很清楚了,可以参考: http://mshijie.iteye.com/blog/366591
发表评论
文章已被作者锁定,不允许评论。
-
关于Thread.IsAlive属性
2015-07-04 12:12 887今天在讨论多线程的时候,谈到了这个属性。IsAlive,顾名 ... -
Java:对象的强、软、弱和虚引用
2015-02-28 11:00 733文章源自:http://zhangjunhd.blog.51 ... -
一个通用并发对象池的实现
2015-01-20 09:32 740Source: http://ifeve.com/gener ... -
如何创建不可变的Java类或对象
2015-01-07 16:29 2192在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过 ... -
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
2014-12-29 11:49 811文章源自:http://www.cnblogs.com/li ... -
中断线程深入
2014-12-25 15:18 799本文转自http://jiangzhengjun.itey ... -
深入java.lang.ThreadLocal类
2014-12-24 16:50 714文章源自:http://lavasoft.blog.51c ... -
Java 8新特性探究(3):解开lambda最强作用的神秘面纱
2014-07-10 17:50 717文章源自:http://developer.51cto.co ... -
Java 8特性探究(2):深入解析默认方法
2014-07-08 11:12 788文章源自:http://develop ... -
Java 8特性探究(1):通往lambda之路_语法篇
2014-07-08 09:59 694文章源自:http://developer.51cto.c ... -
java文件复制方法参考
2013-12-02 14:17 738最快的文件复制方法 private static ... -
用Java数字签名提供XML安全
2013-11-29 16:11 13155文章源自:http://www. ... -
深入理解HashMap的工作原理
2013-11-18 15:49 831HashMap的工作原理是近 ... -
JDBC4.0 驱动加载过程
2013-01-16 10:09 3641注意,jdbc4.0不再需要显示调用class.fo ... -
Java自定义的类加载器
2013-01-15 08:38 1020一、类加载器类别 * 1.java虚拟机自带的加载器 ... -
使用Log4j生成不同日志级别的日志文件
2012-12-26 17:09 5339在src根目录下存放log4j.xml文件,具体配置如下(测试 ... -
深入理解HashMap
2012-12-13 10:08 868文章摘自:http://www.iteye.c ... -
java字节码加解密
2012-06-30 09:53 1107一.创建KEY class Key { ... -
java动态代理简单实现
2012-06-30 09:45 1029一.接口 public interface Foo { ... -
同步器--Exchanger
2012-06-25 08:11 949用于实现两个线程间的数据交换,每个线程在完成一定的任务后想与对 ...
相关推荐
易语言简易线程池的实现。 ——V雪落有声V原创。转载请保留。前文:。为了能充分理解本篇文章的内容,需要了解的知识如下:。1.事件对象的使用:http://baike.baidu.com/view/751499.htm。2.信号量的使用:...
在这个简单的线程池实现中,我们可以通过`pthread_pool.cpp`、`MainFunctionForTest.cpp`、`twork_work.cpp`、`pthread_pool.h`和`twork_work.h`这五个文件来理解其基本架构和工作原理。 首先,`pthread_pool.h`...
在Java中,线程池是通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类来实现的,如`ThreadPoolExecutor`。下面我们将深入探讨线程池的工作原理、核心参数以及如何在实际开发中使用线程池。 线程池...
本资源是基于C++11标准实现的一个简单的线程池,它利用了C++11的新特性,如`std::thread`,`std::function`,以及智能指针等。 首先,`std::thread`是C++11引入的用于创建和管理线程的类。通过创建`std::thread`...
简易的C++11线程池实现,线程池为固定方式,后面会新增非固定模式。
本文将深入探讨如何实现一个简单的线程池,并通过提供的文件名`_threadpool.cpp`, `_promain.cpp`, `_threadpool.h`来解释其核心概念和组件。 首先,`_threadpool.h`是头文件,通常包含类定义和相关函数声明。...
下面将详细讨论线程池的原理及其在Java中的实现。 首先,我们来看`ThreadPoolManager`类,这个类通常用于管理线程池,包括初始化线程池、提交任务以及关闭线程池等操作。线程池的大小可以通过参数设置,可以根据...
"线程池的实现以及底层原理" 线程池是Java多线程编程中的一种常见技术,能够提高系统的性能和可靠性。本文将详细介绍线程池的实现原理、线程池的优势、线程池的类型、线程池的创建方式以及线程池的使用注意事项。 ...
### Linux C线程池简单实现实例 #### 概述 在多线程编程中,线程池是一种广泛采用的设计模式。它通过预先创建多个线程,并将它们组织成一个池,来处理提交的任务,从而避免了频繁创建与销毁线程所带来的性能开销。...
标题 "简单线程池与线程池检查的实现" 涉及到的是计算机编程中的多线程管理和优化,特别是线程池的概念及其检查机制。线程池是一种多线程处理形式,预先创建一定数量的线程,放入池中,当有任务需要执行时,直接从池...
本文将深入探讨VC++中线程池的实现,并提供一个简单的实现示例。 线程池的基本概念: 线程池是由一组工作线程组成的集合,这些线程预先创建并处于待命状态,等待执行由应用程序提交的任务。当一个任务被提交到...
本文将深入探讨如何在Visual Studio 2015(VS2015)环境下实现一个简单的线程池,并解析提供的`TestThreadPool.sln`解决方案和`TestThreadPool`源代码文件。 线程池的基本思想是维护一组预先创建的线程,这些线程...
三、简单的C++线程池代码示例 四、 基于boost编写的源码库 - 线程池 4.1 基于boost编写的源码库地址 4.2 boost线程池的先进先出、后进先出、优先级代码示例 五、看看人家线程池怎么写的 - 要理解精髓 六、线程池应用...
线程池的实现,简单的实现了线程池的功能,稍微改动就可以应用到项目中了
易语言简易线程池的实现 ——V雪落有声V原创 转载请保留 前文: 为了能充分理解本篇文章的内容,需要了解的知识如下: 1.事件对象的使用:http://baike.baidu.com/view/751499.htm 2.信号量的使用:...
本项目"简单的线程池的.net实现"提供了一个自定义线程池的示例,帮助开发者更好地理解和运用线程池。 首先,线程池的主要优点在于其资源管理效率。当任务到达时,线程池会检查是否有空闲线程可供使用,如果有的话,...
然而,如果我们想要从头开始理解线程池的工作原理,或者在特定场景下自定义线程池的行为,那么使用`Vector`来实现简单的线程池是一个很好的学习实践。 标题"使用Vector实现简单线程池"指的是将Java中的`Vector`类...
在给定的资源中,"200行C代码实现简单线程池.doc"可能包含了详细的设计和实现步骤,以及如何在实际项目中应用线程池的文档。而"threadpool.c"则是实际的C语言源代码文件,实现了线程池的核心功能。下面我们将探讨...