<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

    #


    我現(xiàn)在是這樣的
    我有三個文本框,我想每個里面瀏覽者一輸入文字,在表的表格里馬上就自動顯示出來這個文本框輸入的內(nèi)容,有高手指教


    這個很簡單,先說一下實現(xiàn)的原理:利用 JavaScript實現(xiàn)表單的實時互動。 再簡單介紹實現(xiàn)的過程:先給<body>標簽的屬性onload屬性設(shè)置一個值,連接到相應(yīng)的JavaScript函數(shù),JavaScript函數(shù)將文本框中的內(nèi)容通過innerHTML實時傳遞到對應(yīng)ID的表格中的<td></td>標簽對中,便實現(xiàn)了你所要的效果。 

    下面就給你寫下具體的代碼: (復制粘貼到一個TXT文檔中,將后綴名改為htm就可以) 

    <script language="javascript"> 
    function chk() 
    setTimeout("chk()",100); 
    text1.innerHTML = form1.t1.value; 
    text2.innerHTML = form1.t2.value; 
    text3.innerHTML = form1.t3.value; 
    </script> 
    <body onload="chk()"> 
    <form name="form1"> 
    <textarea name="t1"></textarea><br /> 
    <textarea name="t2"></textarea><br /> 
    <textarea name="t3"></textarea><br /> 
    </form> 
    <table border="1" width="200" style="border-collapse: collapse" bordercolor="#008000"> 
    <tr height="100px"> 
    <td id="text1"></td> 
    </tr> 
    <tr height="100px"> 
    <td id="text2"></td> 
    </tr> 
    <tr height="100px"> 
    <td id="text3"></td> 
    </tr> 
    </table> 
    </body>
    posted @ 2011-12-19 13:46 abin 閱讀(635) | 評論 (1)編輯 收藏

         摘要: 1       ICE簡介1.1    簡介ICE(Internet Communications Engine)是一個中間件平臺。作為一個高性能的互聯(lián)網(wǎng)通信平臺,ICE包含了很多分層的服務(wù)和插件(Plug-ins),并且簡單、高效和強大。ICE當前支持C++、Java、C#、Visual...  閱讀全文
    posted @ 2011-12-15 20:35 abin 閱讀(4801) | 評論 (1)編輯 收藏

         摘要: ModelDriven 為什么需要ModelDriven 所謂ModelDriven ,意思是直接把實體類當成頁面數(shù)據(jù)的收集對象。比如,有實體類User 如下: package cn.com.leadfar.struts2.actions; public class User {  &nb...  閱讀全文
    posted @ 2011-12-15 12:44 abin 閱讀(1218) | 評論 (0)編輯 收藏

    現(xiàn)在服務(wù)器端的應(yīng)用程序幾乎都采用了“線程池”技術(shù),這主要是為了提高系統(tǒng)效率。因為如果服務(wù)器對應(yīng)每一個請求就創(chuàng)建一個線程的話,在很短的一段時間內(nèi)就會產(chǎn)生很多創(chuàng)建和銷毀線程動作,導致服務(wù)器在創(chuàng)建和銷毀線程上花費的時間和消耗的系統(tǒng)資源要比花在處理實際的用戶請求的時間和資源更多。線程池就是為了盡量減少這種情況的發(fā)生。
     
      下面我們來看看怎么用Java實現(xiàn)一個線程池。一個比較簡單的線程池至少應(yīng)包含線程池管理器、工作線程、任務(wù)隊列、任務(wù)接口等部分。其中線程池管理器(ThreadPool Manager)的作用是創(chuàng)建、銷毀并管理線程池,將工作線程放入線程池中;工作線程是一個可以循環(huán)執(zhí)行任務(wù)的線程,在沒有任務(wù)時進行等待;任務(wù)隊列的作用是提供一種緩沖機制,將沒有處理的任務(wù)放在任務(wù)隊列中;任務(wù)接口是每個任務(wù)必須實現(xiàn)的接口,主要用來規(guī)定任務(wù)的入口、任務(wù)執(zhí)行完后的收尾工作、任務(wù)的執(zhí)行狀態(tài)等,工作線程通過該接口調(diào)度任務(wù)的執(zhí)行。



    1.為什么要使用線程池
         在java中,如果每個請求到達就創(chuàng)建一個新線程,開銷是相當大的。在實際使用中,服務(wù)器在創(chuàng)建和銷毀線程上花費的時間和消耗的系統(tǒng)資源都相當大,甚至可能要比在處理實際的用戶請求的時間和資源要多的多。除了創(chuàng)建和銷毀線程的開銷之外,活動的線程也需要消耗系統(tǒng)資源。如果在一個jvm里創(chuàng)建太多的線程,可能會使系統(tǒng)由于過度消耗內(nèi)存或“切換過度”而導致系統(tǒng)資源不足。為了防止資源不足,服務(wù)器應(yīng)用程序需要采取一些辦法來限制任何給定時刻處理的請求數(shù)目,盡可能減少創(chuàng)建和銷毀線程的次數(shù),特別是一些資源耗費比較大的線程的創(chuàng)建和銷毀,盡量利用已有對象來進行服務(wù),這就是“池化資源”技術(shù)產(chǎn)生的原因。
         線程池主要用來解決線程生命周期開銷問題和資源不足問題。通過對多個任務(wù)重復使用線程,線程創(chuàng)建的開銷就被分攤到了多個任務(wù)上了,而且由于在請求到達時線程已經(jīng)存在,所以消除了線程創(chuàng)建所帶來的延遲。這樣,就可以立即為請求服務(wù),使用應(yīng)用程序響應(yīng)更快。另外,通過適當?shù)恼{(diào)整線程中的線程數(shù)目可以防止出現(xiàn)資源不足的情況。
    2.線程池的組成部分
        一個比較簡單的線程池至少應(yīng)包含線程池管理器、工作線程、任務(wù)列隊、任務(wù)接口等部分。其中線程池管理器的作用是創(chuàng)建、銷毀并管理線程池,將工作線程放入線程池中;工作線程是一個可以循環(huán)執(zhí)行任務(wù)的線程,在沒有任務(wù)是進行等待;任務(wù)列隊的作用是提供一種緩沖機制,將沒有處理的任務(wù)放在任務(wù)列隊中;任務(wù)接口是每個任務(wù)必須實現(xiàn)的接口,主要用來規(guī)定任務(wù)的入口、任務(wù)執(zhí)行完后的收尾工作、任務(wù)的執(zhí)行狀態(tài)等,工作線程通過該接口調(diào)度任務(wù)的執(zhí)行。
          線程池管理器至少有下列功能:創(chuàng)建線程池,銷毀線程池,添加新任務(wù)。
          工作線程是一個可以循環(huán)執(zhí)行任務(wù)的線程,在沒有任務(wù)時將等待。
          任務(wù)接口是為所有任務(wù)提供統(tǒng)一的接口,以便工作線程處理。任務(wù)接口主要規(guī)定了任務(wù)的入口,任務(wù)執(zhí)行完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等。
    3.線程池適合應(yīng)用的場合
          當一個服務(wù)器接受到大量短小線程的請求時,使用線程池技術(shù)是非常合適的,它可以大大減少線程的創(chuàng)建和銷毀次數(shù),提高服務(wù)器的工作效率。但是線程要求的運動時間比較長,即線程的運行時間比? ......
    posted @ 2011-12-12 16:50 abin 閱讀(10211) | 評論 (0)編輯 收藏

    在多線程大師Doug Lea的貢獻下,在JDK1.5中加入了許多對并發(fā)特性的支持,例如:線程池。

    一、簡介
    線程池類為 java.util.concurrent.ThreadPoolExecutor,常用構(gòu)造方法為:

    ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
    long keepAliveTime, TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    RejectedExecutionHandler handler)

    corePoolSize: 線程池維護線程的最少數(shù)量
    maximumPoolSize
    :線程池維護線程的最大數(shù)量
    keepAliveTime
    : 線程池維護線程所允許的空閑時間
    unit
    : 線程池維護線程所允許的空閑時間的單位
    workQueue
    : 線程池所使用的緩沖隊列
    handler
    : 線程池對拒絕任務(wù)的處理策略

    一個任務(wù)通過 execute(Runnable)方法被添加到線程池,任務(wù)就是一個 Runnable類型的對象,任務(wù)的執(zhí)行方法就是 Runnable類型對象的run()方法。

    當一個任務(wù)通過execute(Runnable)方法欲添加到線程池時:

    如果此時線程池中的數(shù)量小于corePoolSize,即使線程池中的線程都處于空閑狀態(tài),也要創(chuàng)建新的線程來處理被添加的任務(wù)。

    如果此時線程池中的數(shù)量等于 corePoolSize,但是緩沖隊列 workQueue未滿,那么任務(wù)被放入緩沖隊列。

    如果此時線程池中的數(shù)量大于corePoolSize,緩沖隊列workQueue滿,并且線程池中的數(shù)量小于maximumPoolSize,建新的線程來處理被添加的任務(wù)。

    如果此時線程池中的數(shù)量大于corePoolSize,緩沖隊列workQueue滿,并且線程池中的數(shù)量等于maximumPoolSize,那么通過 handler所指定的策略來處理此任務(wù)。

    也就是:處理任務(wù)的優(yōu)先級為:
    核心線程corePoolSize、任務(wù)隊列workQueue、最大線程maximumPoolSize,如果三者都滿了,使用handler處理被拒絕的任務(wù)。

    當線程池中的線程數(shù)量大于 corePoolSize時,如果某線程空閑時間超過keepAliveTime,線程將被終止。這樣,線程池可以動態(tài)的調(diào)整池中的線程數(shù)。

    unit
    可選的參數(shù)為java.util.concurrent.TimeUnit中的幾個靜態(tài)屬性:
    NANOSECONDS
    MICROSECONDSMILLISECONDSSECONDS

    workQueue
    我常用的是:java.util.concurrent.ArrayBlockingQueue

    handler
    有四個選擇:
    ThreadPoolExecutor.AbortPolicy()
    拋出java.util.concurrent.RejectedExecutionException異常
    ThreadPoolExecutor.CallerRunsPolicy()
    重試添加當前的任務(wù),他會自動重復調(diào)用execute()方法
    ThreadPoolExecutor.DiscardOldestPolicy()
    拋棄舊的任務(wù)
    ThreadPoolExecutor.DiscardPolicy()
    拋棄當前的任務(wù)


    二、一般用法舉例

    //------------------------------------------------------------   

    //TestThreadPool.java   

    package com.abin.task;

    import java.io.Serializable;

    import java.util.concurrent.ArrayBlockingQueue;

    import java.util.concurrent.ThreadPoolExecutor;

    import java.util.concurrent.TimeUnit;

    public class TestThreadPool {

     private static int produceTaskSleepTime = 2;

     private static int consumeTaskSleepTime = 2000;

     private static int produceTaskMaxNumber = 10;

     public static void main(String[] args) {

      // 構(gòu)造一個線程池

      ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3,

      TimeUnit.SECONDS, new ArrayBlockingQueue(3),

      new ThreadPoolExecutor.DiscardOldestPolicy());

      for (int i = 1; i <= produceTaskMaxNumber; i++) {

       try {

        // 產(chǎn)生一個任務(wù),并將其加入到線程池

        String task = "task@ " + i;

        System.out.println("put " + task);

        threadPool.execute(new ThreadPoolTask(task));

        // 便于觀察,等待一段時間

        Thread.sleep(produceTaskSleepTime);

       } catch (Exception e) {

        e.printStackTrace();

       }

      }

     }
    }




      

    /**  

    線程池執(zhí)行的任務(wù)  

    * @author hdpan  

    */  

     

    package com.abin.task;

    import java.io.Serializable;

    /**
     *
     * 線程池執(zhí)行的任務(wù)
     *
     * @author hdpan
     */

    public  class ThreadPoolTask implements Runnable, Serializable {

     private static final long serialVersionUID = 0;
     private static int consumeTaskSleepTime = 2000;

     // 保存任務(wù)所需要的數(shù)據(jù)

     private Object threadPoolTaskData;

     ThreadPoolTask(Object tasks) {

      this.threadPoolTaskData = tasks;

     }

     public void run() {

      // 處理一個任務(wù),這里的處理方式太簡單了,僅僅是一個打印語句

      System.out.println("start .." + threadPoolTaskData);

      try {

       // //便于觀察,等待一段時間

       Thread.sleep(consumeTaskSleepTime);

      } catch (Exception e) {

       e.printStackTrace();

      }

      threadPoolTaskData = null;

     }

     public Object getTask() {

      return this.threadPoolTaskData;

     }

    }

     


    //------------------------------------------------------------
    說明:
    1
    、在這段程序中,一個任務(wù)就是一個Runnable類型的對象,也就是一個ThreadPoolTask類型的對象。

    2、一般來說任務(wù)除了處理方式外,還需要處理的數(shù)據(jù),處理的數(shù)據(jù)通過構(gòu)造方法傳給任務(wù)。

    3、在這段程序中,main()方法相當于一個殘忍的領(lǐng)導,他派發(fā)出許多任務(wù),丟給一個叫 threadPool的任勞任怨的小組來做。

    這個小組里面隊員至少有兩個,如果他們兩個忙不過來,任務(wù)就被放到任務(wù)列表里面。

    如果積壓的任務(wù)過多,多到任務(wù)列表都裝不下(超過3)的時候,就雇傭新的隊員來幫忙。但是基于成本的考慮,不能雇傭太多的隊員,至多只能雇傭 4個。

    如果四個隊員都在忙時,再有新的任務(wù),這個小組就處理不了了,任務(wù)就會被通過一種策略來處理,我們的處理方式是不停的派發(fā),直到接受這個任務(wù)為止(更殘忍!呵呵)

    因為隊員工作是需要成本的,如果工作很閑,閑到 3SECONDS都沒有新的任務(wù)了,那么有的隊員就會被解雇了,但是,為了小組的正常運轉(zhuǎn),即使工作再閑,小組的隊員也不能少于兩個。

    4、通過調(diào)整 produceTaskSleepTime consumeTaskSleepTime的大小來實現(xiàn)對派發(fā)任務(wù)和處理任務(wù)的速度的控制,改變這兩個值就可以觀察不同速率下程序的工作情況。

    5、通過調(diào)整4中所指的數(shù)據(jù),再加上調(diào)整任務(wù)丟棄策略,換上其他三種策略,就可以看出不同策略下的不同處理方式。

    6、對于其他的使用方法,參看jdk的幫助,很容易理解和使用。

     

    posted @ 2011-12-12 15:57 abin 閱讀(227) | 評論 (0)編輯 收藏

    java.lang.Object
    java.util.concurrent.AbstractExecutorService
    java.util.concurrent.ThreadPoolExecutor
    所 有已實現(xiàn)的接口:
    ExecutorExecutorService

    強烈建議程序員使用較為方便的 Executors 工廠方法 Executors.newCachedThreadPool()(無界線程池,可以進行自動線程回收)、Executors.newFixedThreadPool(int)(固定大小線程池)和 Executors.newSingleThreadExecutor()(單個后臺線程),它們均為大多數(shù)使用場景預定義了設(shè)置。下面是對ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory, 

    RejectedExecutionHandler handler) 的一些分析:

    1. 核心和最大池大小:ThreadPoolExecutor將根據(jù)corePoolSize和maximumPoolSize設(shè)置的邊界自動調(diào)整大小。當新任務(wù)在方法execute(java.lang.Runnable) 中提交時,如果運行的線程少于 corePoolSize,則創(chuàng)建新線程來處理請求,即使其他輔助線程是空閑的。如果運行的線程多于 corePoolSize 而少于 maximumPoolSize,則僅當隊列滿時才創(chuàng)建新線程。如果設(shè)置的 corePoolSize 和 maximumPoolSize 相同,則創(chuàng)建了固定大小的線程池。如果將 maximumPoolSize 設(shè)置為基本的無界值(如 Integer.MAX_VALUE),則允許池適應(yīng)任意數(shù)量的并發(fā)任務(wù)。
    2.  創(chuàng)建新線程:使用 ThreadFactory 創(chuàng)建新線程。如果沒有另外說明,則在同一個 ThreadGroup 中一律使用 Executors.defaultThreadFactory() 創(chuàng)建線程,并且這些線程具有相同的NORM_PRIORITY 優(yōu)先級和非守護進程狀態(tài)。通過提供不同的 ThreadFactory,可以改變線程的名稱、線程組、優(yōu)先級、守護進程狀態(tài),等等。如果從 newThread 返回 null 時ThreadFactory 未能創(chuàng)建線程,則執(zhí)行程序?qū)⒗^續(xù)運行,但不能執(zhí)行任何任務(wù)。
    3. 保持活動時間 如果池中當前有多于 corePoolSize 的線程,則這些多出的線程在空閑時間超過 keepAliveTime 時將會終止
    4. 排隊所有 BlockingQueue 都可用于傳輸和保持提交的任務(wù)。可以使用此隊列與池大小進行交互:

      • 如果運行的線程少于 corePoolSize,則 Executor 始終首選添加新的線程,而不進行排隊。
      • 如果運行的線程等于或多于 corePoolSize,則 Executor 始終首選將請求加入隊列,而不添加新的線程。
      • 如果無法將請求加入隊列,則創(chuàng)建新的線程,除非創(chuàng)建此線程超出 maximumPoolSize,在這種情況下,任務(wù)將被拒絕。
    5. 排隊有三種通用策略:
      1. 直接提交。工作隊列的默認選項是 SynchronousQueue(一種阻塞隊列,其中每個 put 必須等待一個 take,反之亦然。同步隊列沒有任何內(nèi)部容量,甚至連一個隊列的容量都沒有),它將任務(wù)直接提交給線程而不保持它們。在此,如果不存在可用于立即運行任務(wù)的線程,則試圖把任務(wù)加入隊列將失敗,因此會構(gòu)造一個新的線程此策略可以避免在處理可能具有內(nèi)部依賴性的請求集合時出現(xiàn)鎖定直接提交通常要求無界 maximumPoolSizes 以避免拒絕新提交的任務(wù)。
      2. 無界隊列使用無界隊列(例如,不具有預定義容量的 LinkedBlockingQueue一個基于已鏈接節(jié)點的、范圍任意的 blocking queue)將導致在所有 corePoolSize 線程都忙的情況下將新任務(wù)加入隊列。這樣,創(chuàng)建的線程就不會超過 corePoolSize,maximumPoolSize 的值也就無效了當每個任務(wù)完全獨立于其他任務(wù),即任務(wù)執(zhí)行互不影響時,適合于使用無界隊列,例如,在 Web 頁服務(wù)器中。
      3. 有界隊列當使用有限的 maximumPoolSizes 時,有界隊列(如 ArrayBlockingQueue一個由數(shù)組支持的有界阻塞隊列。此隊列按 FIFO(先進先出)原則對元素進行排序)有助于防止資源耗盡,但是可能較難調(diào)整和控制隊列大小和最大池大小可能需要相互折衷:使用大型隊列和小型池可以最大限度地降低 CPU 使用率、操作系統(tǒng)資源和上下文切換開銷,但是可能導致人工降低吞吐量使用小型隊列通常要求較大的池大小,CPU 使用率較高,但是可能遇到不可接受的調(diào)度開銷,這樣也會降低吞吐量。
    6. 此類提供 protected 可重寫的 beforeExecute(java.lang.Thread, java.lang.Runnable)  afterExecute(java.lang.Runnable, java.lang.Throwable) 方法,這兩種方法分別在執(zhí)行每個任務(wù)之前和之后調(diào)用。如果掛鉤或回調(diào)方法拋出異常,則內(nèi)部輔助線程將依次失敗并突然終止。
    posted @ 2011-12-12 15:23 abin 閱讀(407) | 評論 (0)編輯 收藏

     昨天開始研究java.util.concurrent,是出于線程安全的知識懂得不多,對自己寫的線程池沒有信心,所以就用了包里專家寫好的線程池。這個包的功能很強大。有興趣的朋友可以搜索了解更多的內(nèi)容。

         今天剛寫好了一段200行左右的代碼,拿出來跟大家分享我的學習經(jīng)驗。初次實踐,不足之處,望能得到高手的指點。

    功能說明:一個發(fā)送消息模塊將消息發(fā)送到消息隊列中,無需等待返回結(jié)果,發(fā)送模塊繼續(xù)執(zhí)行其他任務(wù)。消息隊列中的指令由線程池中的線程來處理。使用一個Queue來存放線程池溢出時的任務(wù)。

    TestDriver.java是一個驅(qū)動測試,sendMsg方法不間斷的向ThreadPoolManager發(fā)送數(shù)據(jù)。


    public class TestDriver
    {
        ThreadPoolManager tpm = ThreadPoolManager.newInstance();

        public void sendMsg( String msg )
        {
            tpm.addLogMsg( msg + "記錄一條日志 " );
        }

        public static void main( String[] args )
        {
            for( int i = 0; i < 100; i++ )
            {
                new TestDriver().sendMsg( Integer.toString( i ) );
            }
        }
    }


     


    ThreadPoolManager類:是負責管理線程池的類。同時維護一個Queue和調(diào)度進程。

    public class ThreadPoolManager
    {
     private static ThreadPoolManager tpm = new ThreadPoolManager();

     // 線程池維護線程的最少數(shù)量
     private final static int CORE_POOL_SIZE = 4;

     // 線程池維護線程的最大數(shù)量
     private final static int MAX_POOL_SIZE = 10;

     // 線程池維護線程所允許的空閑時間
     private final static int KEEP_ALIVE_TIME = 0;

     // 線程池所使用的緩沖隊列大小
     private final static int WORK_QUEUE_SIZE = 10;

     // 消息緩沖隊列
     Queue<String> msgQueue = new LinkedList<String>();

     // 訪問消息緩存的調(diào)度線程
     final Runnable accessBufferThread = new Runnable()
     {
      public void run()
      {
       // 查看是否有待定請求,如果有,則創(chuàng)建一個新的AccessDBThread,并添加到線程池中
       if( hasMoreAcquire() )
       {
        String msg = ( String ) msgQueue.poll();
        Runnable task = new AccessDBThread( msg );
        threadPool.execute( task );
       }
      }
     };

     final RejectedExecutionHandler handler = new RejectedExecutionHandler()
     {
      public void rejectedExecution( Runnable r, ThreadPoolExecutor executor )
      {
       System.out.println(((AccessDBThread )r).getMsg()+"消息放入隊列中重新等待執(zhí)行");
       msgQueue.offer((( AccessDBThread ) r ).getMsg() );
      }
     };

     // 管理數(shù)據(jù)庫訪問的線程池
     final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
       CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
       new ArrayBlockingQueue( WORK_QUEUE_SIZE ), this.handler );

     // 調(diào)度線程池
     final ScheduledExecutorService scheduler = Executors
       .newScheduledThreadPool( 1 );

     final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(
       accessBufferThread, 0, 1, TimeUnit.SECONDS );

     public static ThreadPoolManager newInstance()
     {
      return tpm;
     }

     private ThreadPoolManager(){}

     private boolean hasMoreAcquire()
     {
      return !msgQueue.isEmpty();
     }

     public void addLogMsg( String msg )
     {
      Runnable task = new AccessDBThread( msg );
      threadPool.execute( task );
     }
    }




    AccessDBThread類:線程池中工作的線程。

     public class AccessDBThread implements Runnable
    {
     private String msg;
     
     public String getMsg()
     {
      return msg;
     }

     public void setMsg( String msg )
     {
      this.msg = msg;
     }
     
     public AccessDBThread(){
      super();
     }
     
     public AccessDBThread(String msg){
      this.msg = msg;
     }

     public void run()
     {
      // 向數(shù)據(jù)庫中添加Msg變量值
      System.out.println("Added the message: "+msg+" into the Database");
     }

    }


     


    posted @ 2011-12-12 15:09 abin 閱讀(711) | 評論 (0)編輯 收藏

    ThreadPoolManager類:負責管理線程池,調(diào)用輪詢的線程來訪問字符串緩沖區(qū)的內(nèi)容,維護緩沖區(qū),當線程池溢出時拋出的Runnable任務(wù)被加入到字符緩沖區(qū)。



    package com.abin.message.line;

    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.Executors;
    import java.util.concurrent.RejectedExecutionHandler;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.ScheduledFuture;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;

    public class ThreadPoolManager {
    private static ThreadPoolManager tpm = new ThreadPoolManager();
    // 線程池維護線程的最少數(shù)量
    private final static int CORE_POOL_SIZE = 4;
    // 線程池維護線程的最大數(shù)量
    private final static int MAX_POOL_SIZE = 10;
    // 線程池維護線程所允許的空閑時間
    private final static int KEEP_ALIVE_TIME = 0;
    // 線程池所使用的緩沖隊列大小
    private final static int WORK_QUEUE_SIZE = 10;
    // 消息緩沖隊列
    Queue msgQueue = new LinkedList();
    // 訪問消息緩存的調(diào)度線程
    final Runnable accessBufferThread = new Runnable() {
      public void run() {
       // 查看是否有待定請求,如果有,則創(chuàng)建一個新的AccessDBThread,并添加到線程池中
       if (hasMoreAcquire()) {
        String msg = (String) msgQueue.poll();
        Runnable task = new AccessDBThread(msg);
        threadPool.execute(task);
       }
      }
    };
    final RejectedExecutionHandler handler = new RejectedExecutionHandler() {
      public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
       System.out.println(((AccessDBThread) r).getMsg() + "消息放入隊列中重新等待執(zhí)行");
       msgQueue.offer(((AccessDBThread) r).getMsg());
      }
    };
    // 管理數(shù)據(jù)庫訪問的線程池
    final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
       CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
       new ArrayBlockingQueue(WORK_QUEUE_SIZE), this.handler);
    // 調(diào)度線程池
    final ScheduledExecutorService scheduler = Executors
       .newScheduledThreadPool(1);
    final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(
       accessBufferThread, 0, 1, TimeUnit.SECONDS);

    public static ThreadPoolManager newInstance() {
      return tpm;
    }

    private ThreadPoolManager() {
    }

    private boolean hasMoreAcquire() {
      return !msgQueue.isEmpty();
    }

    public void addLogMsg(String msg) {
      Runnable task = new AccessDBThread(msg);
      threadPool.execute(task);
    }
    }














    package com.abin.message.line;

    public class AccessDBThread implements Runnable {
    private String msg;

    public String getMsg() {
      return msg;
    }

    public void setMsg(String msg) {
      this.msg = msg;
    }

    public AccessDBThread() {
      super();
    }

    public AccessDBThread(String msg) {
      this.msg = msg;
    }

    public void run() {
      // 向數(shù)據(jù)庫中添加Msg變量值
      System.out.println("Added the message: " + msg + " into the Database");
    }
    }













    package com.abin.message.line;

    public class TestDriver {
    ThreadPoolManager tpm = ThreadPoolManager.newInstance();

    public void sendMsg(String msg) {
      tpm.addLogMsg(msg + "記錄一條日志 ");
    }

    public static void main(String[] args) {
      for (int i = 0; i < 100; i++) {
       new TestDriver().sendMsg(Integer.toString(i));
      }
    }
    }




    posted @ 2011-12-12 13:21 abin 閱讀(482) | 評論 (0)編輯 收藏

    package com.ibm.abin.util;

    import java.util.Random;

    /**
     * Title: Pager
     * Description: 分頁工具
     */
    public class Pager {
     
     //標準列表分頁,用于后臺
     public static String getPagerNormal(int total, int pagesize, int pagenum,String pageurl) {
      int count = total / pagesize;
      if (total % pagesize > 0) {
       count++;
      }
      if(pageurl.indexOf("?")>-1){
       pageurl = pageurl + "&";
      }else{
       pageurl = pageurl + "?";
      }
      StringBuffer buf = new StringBuffer();
      buf.append("共有"+total+"條記錄&nbsp;&nbsp;");
      buf.append(pagenum+"/"+ count +"&nbsp;&nbsp;");
      if (pagenum == 1) {
       buf.append("<SPAN style='color:#CCCCCC'>【首頁】</SPAN><SPAN style='color:#CCCCCC'>【上一頁】</SPAN>&nbsp;&nbsp;");
      } else {
       buf.append("【<a href='" + pageurl + "pagenum=1'>首頁</a>】【<a href='" + pageurl + "pagenum=" + (pagenum - 1)
         + "' >上一頁</a>】");
      }
      int bound1 = ((pagenum - 2) <= 0) ? 1 : (pagenum - 2);
      int bound2 = ((pagenum + 2) >= count) ? count : (pagenum + 2);
      for (int i = bound1; i <= bound2; i++) {
       if (i == pagenum) {
        buf.append("<SPAN style='color:#FF0000'>" + i
          + "</SPAN>&nbsp;&nbsp;");
       } else {
        buf.append("<a href='" + pageurl + "pagenum=" + i + "'>" + i
          + "</a>&nbsp;&nbsp;");
       }
      }
      if (bound2 < count) {
       buf.append("<SPAN>...</SPAN>");
      }
      if (pagenum == count||count==0) {
       buf.append("<SPAN style='color:#CCCCCC'>【下一頁】</SPAN><SPAN style='color:#CCCCCC'>【尾頁】</SPAN>");
      } else {
       buf.append("【<a href='" + pageurl + "pagenum=" + (pagenum + 1)
         + "'>下一頁</a>】【<a href='" + pageurl + "pagenum=" + count
         + "'>尾頁</a>】");
      }
      return buf.toString();
     }
     
     
     //標準列表分頁2,用于后臺
     public static String getPagerNormal2(int total, int pagesize, int pagenum,String pageurl) {
      int count = total / pagesize;
      if (total % pagesize > 0) {
       count++;
      }
      if(pageurl.indexOf("?")>-1){
       pageurl = pageurl + "&";
      }else{
       pageurl = pageurl + "?";
      }
      StringBuffer buf = new StringBuffer();
      buf.append("共有"+total+"條記錄&nbsp;&nbsp;");
      buf.append(pagenum+"/"+ count +"&nbsp;&nbsp;");
      if (pagenum == 1) {
       buf.append("<SPAN style='color:#CCCCCC'>【首頁】</SPAN><SPAN style='color:#CCCCCC'>【上一頁】</SPAN>&nbsp;&nbsp;");
      } else {
       buf.append("【<a href='" + pageurl + "pagenum=1'>首頁</a>】【<a href='" + pageurl + "pagenum=" + (pagenum - 1)
         + "' >上一頁</a>】");
      }
      int bound1 = ((pagenum - 5) <= 0) ? 1 : (pagenum - 5);
      int bound2 = ((pagenum + 5) >= count) ? count : (pagenum + 5);
      for (int i = bound1; i <= bound2; i++) {
       if (i == pagenum) {
        buf.append("<SPAN style='color:#FF0000'>" + i
          + "</SPAN>&nbsp;&nbsp;");
       } else {
        buf.append("<a href='" + pageurl + "pagenum=" + i + "'>" + i
          + "</a>&nbsp;&nbsp;");
       }
      }
      if (bound2 < count) {
       buf.append("<SPAN>...</SPAN>");
      }
      if (pagenum == count||count==0) {
       buf.append("<SPAN style='color:#CCCCCC'>【下一頁】</SPAN><SPAN style='color:#CCCCCC'>【尾頁】</SPAN>");
      } else {
       buf.append("【<a href='" + pageurl + "pagenum=" + (pagenum + 1)
         + "'>下一頁</a>】【<a href='" + pageurl + "pagenum=" + count
         + "'>尾頁</a>】");
       
       buf.append("第"+pagenum+"/"+ count+"頁  ");
       buf.append("<form action='"+pageurl+"' method='post'><input name='pagenum' format='*N' size='3' maxlength='5' value='' emptyok='true' /><input type='submit' value='跳轉(zhuǎn)' /></form>");
      }
      return buf.toString();
     }
     
     
     
     //簡單列表分頁,用于wap1.0前臺
     public static String getPagerSimple(int total, int pagesize, int pagenum,String pageurl) {
      int count = total / pagesize;
      if (total % pagesize > 0) {
       count++;
      }
      if(pageurl.indexOf("?")>-1){
       pageurl = pageurl + "&amp;";
      }else{
       pageurl = pageurl + "?";
      }
      StringBuffer buf = new StringBuffer();
      if(count>1){
       if (pagenum == count) {
        buf.append("[下頁] ");
       } else {
        buf.append("[<a href='" + pageurl + "pn=" + (pagenum + 1)
          + "'>下頁</a>] ");
       }
       if (pagenum == 1) {
        buf.append("[上頁] ");
       } else {
        buf.append("[<a href='" + pageurl + "pn=" + (pagenum - 1)
          + "'>上頁</a>] ");
       }
       buf.append("第"+pagenum+"/"+ count+"頁  ");
       Random r = new Random();
       int inputpage = r.nextInt(100);
       buf.append("<input name='page"+inputpage+"' value='"+pagenum+"' emptyok='true' format='*N' size='3'/>[<a href='"+pageurl+"pn=$(page"+inputpage+")'>跳轉(zhuǎn)</a>]");
      }
      return buf.toString();
     }
     //簡單列表分頁,用于wap2.0前臺
     public static String getPagerSimple2(int total, int pagesize, int pagenum,String pageurl) {
      int count = total / pagesize;
      if (total % pagesize > 0) {
       count++;
      }
      String pageurl2 ="";
      if(pageurl.indexOf("?")>-1){
       pageurl2 = pageurl + "&amp;";
      }else{
       pageurl2 = pageurl + "?";
      }
      StringBuffer buf = new StringBuffer();
      if(count>1){
       if (pagenum == count) {
        buf.append("[下頁] ");
       } else {
        buf.append("[<a href='" + pageurl2 + "pn=" + (pagenum + 1)
          + "'>下頁</a>] ");
       }
       if (pagenum == 1) {
        buf.append("[上頁] ");
       } else {
        buf.append("[<a href='" + pageurl2 + "pn=" + (pagenum - 1)
          + "'>上頁</a>] ");
       }
       buf.append("第"+pagenum+"/"+ count+"頁  ");
       buf.append("<form action='"+pageurl+"' method='post'><input name='pn' format='*N' size='3' maxlength='5' value='' emptyok='true' /><input type='submit' value='跳轉(zhuǎn)' /></form>");
      }
      return buf.toString();
     }
     public static String getPagerSimple3(int total, int pagesize, int pagenum,String pageurl, String urlLable) {
      int count = total / pagesize;
      if (total % pagesize > 0) {
       count++;
      }
      if(pageurl.indexOf("?")>-1){
       pageurl = pageurl + "&amp;";
      }else{
       pageurl = pageurl + "?";
      }
      StringBuffer buf = new StringBuffer();
      if(count>1){
       if (pagenum != count) {
        buf.append("<a href='");
        buf.append(pageurl);
        buf.append("pn=");
        buf.append(pagenum + 1);    
        buf.append("'>");
        buf.append(urlLable);
        buf.append("</a><br/> ");
       }
       
      }
      return buf.toString();
     }
     //用于長文本分頁
     public static String getPagerText(int total, int pagesize, int pagenum,String pageurl) {
      int count = total / pagesize;
      if (total % pagesize > 0) {
       count++;
      }
      if(pageurl.indexOf("?")>-1){
       pageurl = pageurl + "&amp;";
      }else{
       pageurl = pageurl + "?";
      }
      StringBuffer buf = new StringBuffer();
      if(count>1){
       buf.append("["+pagenum+"/"+count+"]");
       if (pagenum < count-1) {
        buf.append(" <a href='" + pageurl + "pn=" + (pagenum + 1)
          + "'>下頁</a>|");
        if (pagenum > 1) {
         buf.append("<a href='" + pageurl + "pn=" + (pagenum - 1)
           + "'>上頁|</a>");
        }
        buf.append("<a href='" + pageurl + "pn="+ (pagenum + 1)+"&amp;y=0'>余下全文</a>");
       }
       if(pagenum==(count-1)){
        if(pagenum==1){
         buf.append("<a href='" + pageurl + "pn=" + (pagenum + 1)
           + "'>下頁</a>");
        }
        else{
         buf.append("<a href='" + pageurl + "pn=" + (pagenum + 1)
           + "'>下頁|</a>");
        }
        if (pagenum > 1) {
         buf.append("<a href='" + pageurl + "pn=" + (pagenum - 1)
           + "'>上頁</a>");
        }
       }
       if(pagenum==count){
        buf.append("<a href='" + pageurl + "pn=" + (pagenum - 1)
          + "'>上頁</a>");
       }
       
       buf.append("<br/>");
       //for(int i=1;i<=count;i++){
       // if(pagenum==i){
       //  buf.append("["+i+"]");
       // }else{
       //  buf.append("[<a href='" + pageurl + "pn=" + i +"'>"+i+"</a>]");
       // }
       //}
      }
      return buf.toString();
     }
    }

    posted @ 2011-12-12 09:56 abin 閱讀(1847) | 評論 (0)編輯 收藏

    1.  超級用戶相關(guān):
    1. use admin
    2. #增加或修改用戶密碼
    3. db.addUser(ixigua,’pwd’)
    4. #查看用戶列表
    5. db.system.users.find()
    6. #用戶認證
    7. db.auth(ixigua,’pwd’)
    8. #刪除用戶
    9. db.removeUser(‘mongodb’)
    10. #查看所有用戶
    11. show users
    12. #查看所有數(shù)據(jù)庫
    13. show dbs
    14. #查看所有的collection
    15. show collections
    16. #查看各collection的狀態(tài)
    17. db.printCollectionStats()
    18. #查看主從復制狀態(tài)
    19. db.printReplicationInfo()
    20. #修復數(shù)據(jù)庫
    21. db.repairDatabase()
    22. #設(shè)置記錄profiling,0=off 1=slow 2=all
    23. db.setProfilingLevel(1)
    24. #查看profiling
    25. show profile
    26. #拷貝數(shù)據(jù)庫
    27. db.copyDatabase(‘mail_addr’,'mail_addr_tmp’)
    28. #刪除collection
    29. db.mail_addr.drop()
    30. #刪除當前的數(shù)據(jù)庫
    31. db.dropDatabase()
    2. 客戶端連接
    1. /usr/local/mongodb/bin/mongo 8.8.88/ixigualib -u ixigua -p ‘pwd’
    3. 增刪改
    1. #存儲嵌套的對象
    2. db.foo.save({‘name’:'ysz’,'address’:{‘city’:'beijing’,'post’:100096},’phone’:[138,139]})
    3. #存儲數(shù)組對象
    4. db.user_addr.save({‘Uid’:'yushunzhi@sohu.com’,'Al’:['test-1@sohu.com','test-2@sohu.com']})
    5. #根據(jù)query條件修改,如果不存在則插入,允許修改多條記錄
    6. db.foo.update({‘yy’:5},{‘$set’:{‘xx’:2}},upsert=true,multi=true)
    7. #刪除yy=5的記錄
    8. db.foo.remove({‘yy’:5})
    9. #刪除所有的記錄
    10. db.foo.remove()
    4. 索引
    1. #增加索引:1(ascending),-1(descending)
    2. db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
    3. #索引子對象
    4. db.user_addr.ensureIndex({‘Al.Em’: 1})
    5. #查看索引信息
    6. db.deliver_status.getIndexes()
    7. db.deliver_status.getIndexKeys()
    8. #根據(jù)索引名刪除索引
    9. db.user_addr.dropIndex(‘Al.Em_1′)
    5. 查詢
    1. #查找所有
    2. db.foo.find()
    3. #查找一條記錄
    4. db.foo.findOne()
    5. #根據(jù)條件檢索10條記錄
    6. db.foo.find({‘msg’:'Hello 1′}).limit(10)
    7. #sort排序
    8. db.deliver_status.find({‘From’:'ixigua@sina.com’}).sort({‘Dt’,-1})
    9. db.deliver_status.find().sort({‘Ct’:-1}).limit(1)
    10. #count操作
    11. db.user_addr.count()
    12. #distinct操作
    13. db.foo.distinct(‘msg’)
    14. #>操作
    15. db.foo.find({“timestamp”: {“$gte” : 2}})
    16. #子對象的查找
    17. db.foo.find({‘address.city’:'beijing’})
    6. 管理
    1. #查看collection數(shù)據(jù)的大小
    2. db.deliver_status.dataSize()
    3. #查看colleciont狀態(tài)
    4. db.deliver_status.stats()
    5. #查詢所有索引的大小
    6. db.deliver_status.totalIndexSize()

    posted @ 2011-12-06 19:53 abin 閱讀(402) | 評論 (0)編輯 收藏

    僅列出標題
    共50頁: First 上一頁 42 43 44 45 46 47 48 49 50 下一頁 
    主站蜘蛛池模板: 黄页网站免费观看| 黄在线观看www免费看| 久久国产精品萌白酱免费| 精品无码国产污污污免费网站| 国产高清免费视频| 日韩精品视频免费网址| 亚洲欧洲自拍拍偷精品 美利坚 | 成人毛片免费网站| 国产一级淫片免费播放| 亚洲精品一品区二品区三品区| 久久精品国产亚洲av麻豆色欲| 亚洲综合伊人制服丝袜美腿| 国产尤物在线视精品在亚洲| 中文字幕一区二区三区免费视频| 中文字幕免费高清视频| 日本高清免费aaaaa大片视频| 在线亚洲人成电影网站色www| 亚洲图片中文字幕| 免费在线观看一区| 免费无码一区二区三区| 日韩a级毛片免费观看| 亚洲国产精品无码成人片久久| 456亚洲人成影院在线观| 一本岛v免费不卡一二三区| 亚洲成人免费网址| 九月婷婷亚洲综合在线 | 国产精品亚洲αv天堂无码| 亚洲美免无码中文字幕在线| 成人亚洲国产精品久久| 亚洲免费在线视频| 又粗又硬又黄又爽的免费视频| 亚洲国产精品免费视频| 色婷婷精品免费视频| 99精品热线在线观看免费视频| 在线视频免费国产成人| 久久精品国产亚洲av麻豆色欲| 特级毛片免费播放| 91精品国产免费久久久久久青草| 中文字幕亚洲激情| 亚洲精品一卡2卡3卡四卡乱码| 久久精品一区二区免费看|