`
love19820823
  • 浏览: 928216 次
文章分类
社区版块
存档分类
最新评论

JAVA线程池的简单实现及优先级设置

 
阅读更多
我们大家都知道,在处理多线程服务并发时,由于创建线程需要占用很多的系统资源,所以为了避免这些不必要的损耗,通常我们采用线程池来解决这些问题。
线程池的基本原理是,首先创建并保持一定数量的线程,当需要使用线程时,我们从池中取得线程,再将需要运行的任务交给线程进行处理,当任务完成后再将其释放回池中。
下面,我给出一个很简单的实现模型,仅供参考。

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多线程,并设置优先级案例,一段完整的程序,加上自己的东西就可以跑起来

    极简的java异步事件处理组件,使用优先级队列线程池.rar

    所有的可以显示出来的图形元素都称为Component,Component代表了所有的可见的图形元素,... Pannel应用比较典型的就是Applet(JAVA的页面小应用程序),现在基本上已经不用了,AJAX和JAVASCRIPT完全取代了它的应用。

    java线程池封装

    java线程池封装,可自定义线程优先级,使用方便。。。

    Java 4种线程池的使用

    Java通过Executors提供四种线程池,分别为:  newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。  newFixedThreadPool 创建一个定长线程池...

    java线程优先级原理详解

    主要介绍了java线程优先级原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    12行代码,使用Java的并发和多线程技术实现简单的任务调度器

    实现了一个简单的任务调度器,可以安排任务在指定的延迟时间后执行。 使用Java的...这个功能还可以通过扩展来实现更高级的功能,例如支持多个任务调度器实例、支持动态调整线程池大小、支持任务优先级等。

    java多线程编程总结

    Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者...

    Java多线程编程总结

    Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者...

    Java 线程总结

    Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者...

    Java 7并发编程实战手册

    全书通过60多个简单而非常有效的实例,帮助读者快速掌握Java 7多线程应用程序的开发技术。学习完本书,你可以将这些开发技术直接应用到自己的应用程序中。 《Java 7并发编程实战手册》适合具有一定Java编程基础的...

    java jdk实列宝典 光盘源代码

    滚动的消息,实现一个简单的动画,具有滚动效果的文本消息RollingMessage.java; 三维弹球,BouncingB.java; 贪吃蛇游戏SnakeModel.java; java的声音处理,介绍java中如何处理声音,包括实现响铃,播放wav,au等音频...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链阻塞双端队列 LinkedBlockingDeque 10. 并发 Map(映射) ConcurrentMap 11. 并发导航映射 ...

    Java并发编程原理与实战

    ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    Java多线程核心技术讲解

    Java多线程核心技术:理解多线程、在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 开发...

Global site tag (gtag.js) - Google Analytics