線程池使用
1.1 線程池配置
可以在任意的aop xml配置檔案中配置線程池,隻需将相關的xml配置檔案直接或者間接導入manager-provider.xml檔案既可,這裡以一個thread.xml檔案為列來說明線程池的配置:
<?xml version="1.0" encoding='gb2312'?>
<manager-config>
<properties>
<property name="test.threadpool">
<map>
<property name="corePoolSize" value="5" />
<property name="maximumPoolSize" value="10" />
<!--
TimeUnit.SECONDS TimeUnit.MICROSECONDS TimeUnit.MILLISECONDS
TimeUnit.NANOSECONDS 時間機關适用于以下參數: keepAliveTime waitTime
delayTime(當delayTime為整數時間而不是百分比時有效)
-->
<property name="timeUnit" value="TimeUnit.SECONDS" />
<property name="keepAliveTime" value="40" />
/** * LinkedBlockingQueue * PriorityBlockingQueue *
ArrayBlockingQueue * SynchronousQueue */
<property name="blockingQueueType" value="ArrayBlockingQueue" />
<property name="blockingQueue" value="10" />
RejectedExecutionHandler
必須實作java.util.concurrent.RejectedExecutionHandler接口 目前系統提供以下預設實作:
org.frameworkset.thread.WaitPolicy
循環等待event.threadpool.waitTime指定的時間,機關為秒
java.util.concurrent.ThreadPoolExecutor.DiscardPolicy 直接丢棄任務,不抛出異常
java.util.concurrent.ThreadPoolExecutor.AbortPolicy
直接丢棄任務,抛出異常RejectedExecutionException
java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy 直接運作
java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy
放入隊列,将最老的任務删除
<property name="rejectedExecutionHandler" value="org.frameworkset.thread.WaitPolicy" />
以下參數隻有在配置的org.frameworkset.thread.WaitPolicy政策時才需要配置
-->
<property name="waitTime" value="1" />
<property name="delayTime" value="10%" />
<property name="maxWaits" value="2" />
<property name="waitFailHandler"
value="org.frameworkset.thread.TestThread$WaitFailHandlerTest" />
</map>
</property>
</properties>
</manager-config>
将thread.xml檔案存儲在classes目錄下,在manager-provider.xml檔案中導入既可:
<managerimport file="thread.xml" />
可以配置多個線程池,隻要<property name="test.threadpool">指定不同的name(線程池的名稱)即可。
1.2 擷取線程池執行個體
擷取線程池執行個體的方法如下:
ThreadPoolExecutor
executer =
ThreadPoolManagerFactory.getThreadPoolExecutor("test.threadpool");
擷取名稱test.threadpool時不會每次都建立線程池的執行個體,隻有第一次擷取時才會建立執行個體,是以是單執行個體的。如果在擷取test.threadpool的線程池是,對應的配置檔案中并沒有配置test.threadpool那麼将采用預設的線程池參數來建立線程池執行個體。
預設的配置資訊如下:
Pro pro = new Pro();
pro.setName("corePoolSize");pro.setValue("5");
defaultPoolparams.put("corePoolSize", pro);
pro = new Pro();
pro.setName("maximumPoolSize");pro.setValue("10");
defaultPoolparams.put("maximumPoolSize", pro);
pro.setName("keepAliveTime");pro.setValue("30");
defaultPoolparams.put("keepAliveTime", pro);
pro.setName("timeUnit");pro.setValue("TimeUnit.SECONDS");
defaultPoolparams.put("timeUnit", pro);
pro.setName("blockingQueue");pro.setValue("10");
defaultPoolparams.put("blockingQueue", pro);
/**
* DelayQueue LinkedBlockingQueue PriorityBlockingQueue
* ArrayBlockingQueue SynchronousQueue
*/
pro.setName("blockingQueueType");pro.setValue("ArrayBlockingQueue");
defaultPoolparams.put("blockingQueueType", pro);
pro.setName("rejectedExecutionHandler");pro.setValue("org.frameworkset.thread.RejectRequeuePoliecy");
defaultPoolparams.put("rejectedExecutionHandler", pro);
pro.setName("waitTime");pro.setValue("1");
defaultPoolparams.put("waitTime", pro);
pro.setName("delayTime");pro.setValue("20%");
defaultPoolparams.put("delayTime", pro);
pro.setName("maxWaits");pro.setValue("-1");
defaultPoolparams.put("maxWaits", pro);
pro.setName("maxdelayTime");pro.setValue("4");
defaultPoolparams.put("maxdelayTime", pro);
1.3 使用線程池來執行任務
1.3.1 定義一個任務
public static class Run implements Runnable
{
public void run()
{
if (true)
{
i ++;
System.out.println("run:"+ i);
try
{
synchronized(this)
{
this.wait(4000);
}
}
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1.3.2 利用線程池來執行任務
一般的使用方法:
ThreadPoolExecutor executer = ThreadPoolManagerFactory.getThreadPoolExecutor("test.threadpool");
for(int i = 0; i < 50 ; i ++)
executer.execute(new Run());
如果線程池趨于繁忙時,外部可以通過執行 InnerThreadPoolExecutor類的以下方法來緩解系統的壓力(采用等待阻塞延時方法):
public boolean busy(RejectCallback rejectcallback, BaseLogger log)
例如:
InnerThreadPoolExecutor executer = (InnerThreadPoolExecutor)ThreadPoolManagerFactory.getThreadPoolExecutor("test.threadpool");
{
executor.busy(rejectcallback, baselog);
executer.execute(new Run());
rejectcallback為org.frameworkset.thread. RejectCallback的子類,
baselog為org.frameworkset.log.BaseLog的類執行個體。
1.3.3 線程池的關閉
所有的線程池在jvm關閉時自動關閉。