`
xielingjiang
  • 浏览: 32886 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于线程Pool的分析

阅读更多
池的概念在任何计算机语言中是一个非常重要的思想,任何事情都是有因果的,没有无缘无故的技术,总是为了解决什么问题而出现的。
池的概念就是为了解决资源有限而需求无限的问题。人总是贪婪的,所以总是想占有最多最好的资源,但是人是社会性的,所以需要跟大伙共享一些公共资源,那如何解决这个资源分配的问题呢?
首先资源分配总的原则应该是公平合理高效。翻开经济学的定义,
经济学是一个社会如何利用稀缺的资源生产有价值的物品和劳务,并将它们在不同的人中间进行分配。

为什么
回到线程池,首先,为什么线程是有限资源?
第一线程可以很多,为什么有很多,因为要同时做两件事情嘛,而且做一件事情的时候可能需要等待的时间或者在多核CPU的情况下,因此为了不浪费时间或者为了充分利用多核的硬件,我们就在提出了多线程的概念。
那为什么线程的多少有限呢?应该说java里面线程可以随便创建,关键是创建需要时间,销毁也相当耗时间,就像我要吃饭这个事情,非要让我在去吃饭的路上花很多时间一样,完全喧宾夺主啊。
因此我们把这些公共的创建线程,销毁线程的动作放在一个池里面,让池来预先帮我们做好这些事情,这样不就大大提高了执行的效率了吗?
而且这种集中式的管理,对于监控带来了极大的优点。这就是小动作大力量啊。

怎么做
首先,我们需要一个池,我叫它ThreadPool
其次,需要线程,我叫它WorkThread
其它的就是一些增强的功能,比如我定义的Tracker用来监控每个任务执行的情况和ThreadPoolContainer用来包含和组织这些动作。
核心代码如下:
ThreadPool
private static ArrayList<WorkThread> allThreads=new ArrayList<WorkThread>();
private LinkedBlockingQueue<WorkThread> freeThreads=new LinkedBlockingQueue<WorkThread>();
public synchronized boolean notifyOnNewTask(Runnable cmd) {

		WorkThread temp=null;
		while((temp=freeThreads.poll())!=null){
			if(temp.canWork()){
				temp.addTask(cmd);
				return true;
			}//if not free, go to next thread
		}
		while(allThreads.size()<maxSize){
			WorkThread thread=new WorkThread(this,groupName+allThreads.size(),isDaemon);
			allThreads.add(thread);
			thread.start();
			if(thread.canWork()){
				thread.addTask(cmd);
				return true;
			}
		}
		waitingQueue.add(cmd);
		return false;
		
	}
	
	//free a thread
	public synchronized void addToFreeList(WorkThread workThread) {
		Runnable cmd=waitingQueue.poll();
		if(cmd!=null){//no need to add to free list, who is free, who will do the job.
			workThread.addTask(cmd);
			return;
		}
		if(!freeThreads.contains(workThread)){
			freeThreads.add(workThread);
		}
		
	}


WorkThread
public void run() {
		while (isUp) {
			isFree.set(true);
			m_pool.addToFreeList(this);
			try {
				Runnable o=queue.poll(10000, TimeUnit.MILLISECONDS);
				if(o==null){
					if(isUp==false){
						return;
					}
					continue;
				}
				isFree.set(false);
				o.run();
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}// wait
		}
	}


CommandTracker
	public void oneIsDone(WrappingCommandTask task) {
		m_counter.decrementAndGet();
		synchronized (this) {
			if (m_counter.decrementAndGet() == 0) {
				// signal
				notify();
			}
		}
	}
	public boolean isAllDone() {
		return m_counter.get() ==0;
	}



To Be Continue...
目前还未对线程池里面每个线程的优先启用算法进行编写,而是采用了Queue的FIFO的模式
也就是说最先加入free队列的最先被启用。当线程池满的时候,任务会加入到线程是的waiting队列,此时优先级是LIFO,即最近需要加入free队列的线程最先被启用。
下一步需要考虑优先级可以为最少分配任务的那个线程做处理或者任务预分配。因为在WorkThread里面有个执行队列,因此在每个WorkThread里面设置一个阀值,允许一次加入的最大任务数。
分享到:
评论
1 楼 xielingjiang 2011-01-14  
对线程池的再次理解

对java1.5的concurrent包的拜读,我发现我上面写的线程池的锁机制还是有缺陷的。
因为如果对线程池整个进行锁定(Synchronized)的话,效率不太高。
借鉴jdk1.5,两把锁的机制是很好的实现。
原理就是:
一把put锁,一把get锁
两把锁互不干扰,可以一边put一边get,而不是put的时候不允许get,get的时候不允许put。

比如多个线程要put,那么就需要首选拿到put锁,而不需要拿到get锁。这样在put完以后通知get锁count有了。然后多个取线程先拿到get所有进行读操作。
总之,put和get各自做各自的事情。

衍生一下,concurrentHashMap里面设置了多组put/get锁,即多个slot对应多组put/get锁。
正式利用了hash不冲突的特点。

相关推荐

    Python mutiprocessing多线程池pool操作示例

    主要介绍了Python mutiprocessing多线程池pool操作,结合实例形式分析了Python多线程模块multiprocessing进程池相关操作技巧,需要的朋友可以参考下

    13、线程池ForkJoinPool实战及其工作原理分析(1).pdf

    13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1)....

    ForkJoinPool

    ForkJoinPool初略分析 多线程 ForkJoinPool 补充:为什么不适合执行有block比如有io的任务 线程block的时候,线程池会调度线程池队列中的其他未线程运行,这是ExecutorService的机制; 但是ForkJoinPool中的...

    Python实现多线程下载脚本的示例代码

    0x01 分析 一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类: Download类:包含download()和get_complete_rate()两种方法。 download()方法种首先用 urlopen() 方法打开远程资源并通过 Content-...

    浅析MySQL内存的使用说明(全局缓存+线程缓存)

    首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分): 代码如下:per_thread_buffers=(read_buffer_size+read_rnd_buffer_size+sort_buffer_size+thread_...

    《深入理解Android》卷Ⅰ

    6.2.5 秋风扫落叶-StartThread Pool和join Thread Pool分析 6.2.6 你彻底明白了吗 6.3 服务总管ServiceManager 6.3.1 ServiceManager的原理 6.3.2 服务的注册 6.3.3 ServiceManager存在的意义 6.4 ...

    Python multiprocess pool模块报错pickling error问题解决方法分析

    之前在调用class内的函数用multiprocessing模块的pool函数进行多线程处理的时候报了以下下错误信息: PicklingError: Can’t pickle &lt;type&gt;: attribute lookup __builtin__.function failed 查了下官方文档发现python...

    MySQL.pdf MySQL.pdf

    Connection Pool: 连接池 管理缓冲用户连接,线程处理等需要缓存的需求。 负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每 一个连接上 MySQL Server 的客户端请求都会被分配...

    python多线程用法实例详解

    本文实例分析了python多线程用法。分享给大家供大家参考。具体如下: 今天在学习尝试学习python多线程的时候,突然发现自己一直对super的用法不是很清楚,所以先总结一些遇到的问题。当我尝试编写下面的代码的时候:...

    java线程池概念.txt

    前面的判断过程中并没有加锁,因此可能在execute方法判断的时候poolSize小于corePoolSize,而判断完之后,在其他线程中又向线程池提交了任务,就可能导致poolSize不小于corePoolSize了,所以需要在这个地方继续判断 ...

    深入理解Android卷1全

    6.2.5 秋风扫落叶-StartThread Pool和join Thread Pool分析 / 149 6.2.6 你彻底明白了吗 / 152 6.3 服务总管ServiceManager / 152 6.3.1 ServiceManager的原理 / 152 6.3.2 服务的注册 / 155 6.3.3 ServiceManager...

    11-线程池ThreadPoolExecutor底层原理源码分析(上)-周瑜.pdf

    13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1)....

    12-线程池ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf

    13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1)....

    weblogic平台J2EE调优策略

    weblogic 调优策略,前 言 第一章 应用程序调优 1.1.1 通用代码调优 1.1.2 减小没有必要的操作 1.1.3 使用合适的类型 1.1.4 尽量使用pool,buffer和cache 1.2 JDBC代码调优 1.2.1 严格资源使用 ...关于作者

    深入理解Android:卷I--详细书签版

    6.2.5 秋风扫落叶——StartThread Pool和join Thread Pool分析 149 6.2.6 你彻底明白了吗 152 6.3 服务总管ServiceManager 152 6.3.1 ServiceManager的原理 152 6.3.2 服务的注册 155 6.3.3 ServiceManager...

    16、常用并发设计模式精讲(1).pdf

    13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1)....

    14、深入理解并发可见性、有序性、原子性与JMM内存模型(1).pdf

    13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1)....

    15、CPU缓存架构详解&高性能内存队列Disruptor实战(1).pdf

    13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1)....

    designpattern.zip

    13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1)....

    forkjoin.zip

    13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1)....

Global site tag (gtag.js) - Google Analytics