天天看點

bbossgroups 線程池使用

       線程池使用

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關閉時自動關閉。