我们大家都知道,在处理多线程服务并发时,由于创建线程需要占用很多的系统资源,所以为了避免这些不必要的损耗,通常我们采用线程池来解决这些问题。
线程池的基本原理是,首先创建并保持一定数量的线程,当需要使用线程时,我们从池中取得线程,再将需要运行的任务交给线程进行处理,当任务完成后再将其释放回池中。
下面,我给出一个很简单的实现模型,仅供参考。
ThreadPool.java
packageorg.loon.framework.util.test;
importjava.util.LinkedList;
importjava.util.List;
/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/
publicclassThreadPool...{
privatestaticThreadPoolinstance=null;
//优先级低
publicstaticfinalintPRIORITY_LOW=0;
//普通
publicstaticfinalintPRIORITY_NORMAL=1;
//高
publicstaticfinalintPRIORITY_HIGH=2;
//用以保存空闲连接
privateList[]_idxThreads;
//关闭
privateboolean_shutdown=false;
//线程数量
privateint_threadCount=0;
//debug信息是否输出
privateboolean_debug=false;
/***//**
*返回ThreadPool实例
*
*@return
*/
publicstaticThreadPoolgetInstance()...{
if(instance==null)...{
instance=newThreadPool();
}
returninstance;
}
//初始化线程list
privateThreadPool()...{
this._idxThreads=newList[]...{newLinkedList(),newLinkedList(),
newLinkedList()};
this._threadCount=0;
}
/***//**
*同步方法,完成任务后将资源放回线程池中
*@paramrepool
*/
protectedsynchronizedvoidrepool(Pooledrepool)...{
if(this._shutdown)...{
if(this._debug)...{
System.out.println("ThreadPool.repool():重设中……");
}
//优先级别判定
switch(repool.getPriority())...{
caseThread.MIN_PRIORITY:
this._idxThreads[PRIORITY_LOW].add(repool);
break;
caseThread.NORM_PRIORITY:
this._idxThreads[PRIORITY_NORMAL].add(repool);
break;
caseThread.MAX_PRIORITY:
this._idxThreads[PRIORITY_HIGH].add(repool);
break;
default:
thrownewIllegalStateException("没有此种级别");
}
//通知所有线程
notifyAll();
}else...{
if(this._debug)...{
System.out.println("ThreadPool.repool():注销中……");
}
repool.shutDown();
}
if(this._debug)...{
System.out.println("ThreadPool.repool():完成");
}
}
publicvoidsetDebug(booleandebug)...{
this._debug=debug;
}
publicsynchronizedvoidshutDown()...{
this._shutdown=true;
if(this._debug)...{
System.out.println("ThreadPool.shutDown():关闭中……");
}
for(intindex=0;index<=PRIORITY_NORMAL;index++)...{
Listthreads=this._idxThreads[index];
for(intthreadIndex=0;threadIndex<threads.size();threadIndex++)...{
PooledidleThread=(Pooled)threads.get(threadIndex);
idleThread.shutDown();
}
}
notifyAll();
}
/***//**
*以指定的优先级启动线程
*@paramtarget
*@parampriority
*/
publicsynchronizedvoidstart(Runnabletarget,intpriority)...{
Pooledthread=null;
ListidleList=this._idxThreads[priority];
intidleSize=idleList.size();
if(idleSize>0)...{
intlastIndex=idleSize-1;
thread=(Pooled)idleList.get(lastIndex);
idleList.remove(idleList);
thread.setTarget(target);
}else...{
this._threadCount++;
thread=newPooled(target,"Pooled->"+this._threadCount,this);
switch(priority)...{
casePRIORITY_LOW:
thread.setPriority(Thread.MIN_PRIORITY);
break;
casePRIORITY_NORMAL:
thread.setPriority(Thread.NORM_PRIORITY);
break;
casePRIORITY_HIGH:
thread.setPriority(Thread.MAX_PRIORITY);
break;
default:
thread.setPriority(Thread.NORM_PRIORITY);
}
//启动
thread.start();
}
}
/***//**
*返回线程数量
*
*@return
*/
publicintgetThreadsCount()...{
returnthis._threadCount;
}
}
Pooled.java:
packageorg.loon.framework.util.test;
/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/
publicclassPooledextendsThread...{
privateThreadPool_pool;
privateRunnable_target;
privateboolean_shutdown=false;
privateboolean_idle=false;
publicPooled(Runnabletarget)...{
super(target);
}
publicPooled(Runnabletarget,Stringname)...{
super(target,name);
}
publicPooled(Runnabletarget,Stringname,ThreadPoolpool)...{
super(name);
this._pool=pool;
this._target=target;
}
publicPooled(Stringname)...{
super(name);
}
publicPooled(ThreadGroupgroup,Runnabletarget)...{
super(group,target);
}
publicPooled(ThreadGroupgroup,Runnabletarget,Stringname)...{
super(group,target,name);
}
publicPooled(ThreadGroupgroup,Stringname)...{
super(group,name);
}
publicRunnablegetTarget()...{
returnthis._target;
}
publicbooleanisIdle()...{
returnthis._idle;
}
publicvoidrun()...{
while(!this._shutdown)...{
this._idle=false;
if(this._target!=null)...{
this._target.run();
}
this._idle=true;
try...{
this._pool.repool(this);
synchronized(this)...{
wait();
}
}catch(InterruptedExceptionex)...{
System.err.println(ex.getMessage());
}
this._idle=false;
}
}
publicsynchronizedvoidsetTarget(Runnabletarget)...{
this._target=target;
notifyAll();
}
publicsynchronizedvoidshutDown()...{
this._shutdown=true;
notifyAll();
}
}
测试用类:
packageorg.loon.framework.util.test;
/***//**
*<p>Title:LoonFramework</p>
*<p>Description:线程池测试</p>
*<p>Copyright:Copyright(c)2007</p>
*<p>Company:LoonFramework</p>
*@authorchenpeng
*@email:ceponline@yahoo.com.cn
*@version0.1
*/
publicclassThreadPoolTest...{
privatestaticRunnablecreateRunnable(finalintid)...{
returnnewRunnable()...{
publicvoidrun()...{
System.out.println("线程"+id+",运行 ");
try...{
Thread.sleep(1000);
}
catch(InterruptedExceptionex)...{}
System.out.println("线程"+id+",结束");
}
};
}
publicstaticvoidmain(String[]args)...{
ThreadPoolpool=ThreadPool.getInstance();
pool.setDebug(true);
for(inti=1;i<=10;i++)...{
//根据数值,设定不同优先级
if(i%2==0)...{
pool.start(createRunnable(i),ThreadPool.PRIORITY_HIGH);
}else...{
pool.start(createRunnable(i),ThreadPool.PRIORITY_LOW);
}
}
System.out.println("线程池测试中……");
System.out.println("线程池线程总数:"+pool.getThreadsCount());
pool.shutDown();
}
}
分享到:
相关推荐
线程池提交优先级,执行优先级
JAVA多线程,并设置优先级案例,一段完整的程序,加上自己的东西就可以跑起来
所有的可以显示出来的图形元素都称为Component,Component代表了所有的可见的图形元素,... Pannel应用比较典型的就是Applet(JAVA的页面小应用程序),现在基本上已经不用了,AJAX和JAVASCRIPT完全取代了它的应用。
java线程池封装,可自定义线程优先级,使用方便。。。
Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池...
主要介绍了java线程优先级原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
实现了一个简单的任务调度器,可以安排任务在指定的延迟时间后执行。 使用Java的...这个功能还可以通过扩展来实现更高级的功能,例如支持多个任务调度器实例、支持动态调整线程池大小、支持任务优先级等。
Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者...
Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者...
Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者...
全书通过60多个简单而非常有效的实例,帮助读者快速掌握Java 7多线程应用程序的开发技术。学习完本书,你可以将这些开发技术直接应用到自己的应用程序中。 《Java 7并发编程实战手册》适合具有一定Java编程基础的...
滚动的消息,实现一个简单的动画,具有滚动效果的文本消息RollingMessage.java; 三维弹球,BouncingB.java; 贪吃蛇游戏SnakeModel.java; java的声音处理,介绍java中如何处理声音,包括实现响铃,播放wav,au等音频...
6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ...
ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....
《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...
Java多线程核心技术:理解多线程、在Java中实现多线程、线程的生命周期、线程的优先级、线程的同步、线程的阻塞、守护线程、线程组、线程池、总结。
1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发...