少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          #


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


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

          下面就給你寫下具體的代碼: (復制粘貼到一個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 閱讀(637) | 評論 (1)編輯 收藏

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

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

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



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

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

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

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

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

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

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

          如果此時線程池中的數量小于corePoolSize,即使線程池中的線程都處于空閑狀態,也要創建新的線程來處理被添加的任務。

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

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

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

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

          當線程池中的線程數量大于 corePoolSize時,如果某線程空閑時間超過keepAliveTime,線程將被終止。這樣,線程池可以動態的調整池中的線程數。

          unit
          可選的參數為java.util.concurrent.TimeUnit中的幾個靜態屬性:
          NANOSECONDS
          MICROSECONDS、MILLISECONDS、SECONDS

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

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


          二、一般用法舉例

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

          //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) {

            // 構造一個線程池

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

            TimeUnit.SECONDS, new ArrayBlockingQueue(3),

            new ThreadPoolExecutor.DiscardOldestPolicy());

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

             try {

              // 產生一個任務,并將其加入到線程池

              String task = "task@ " + i;

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

              threadPool.execute(new ThreadPoolTask(task));

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

              Thread.sleep(produceTaskSleepTime);

             } catch (Exception e) {

              e.printStackTrace();

             }

            }

           }
          }




            

          /**  

          線程池執行的任務  

          * @author hdpan  

          */  

           

          package com.abin.task;

          import java.io.Serializable;

          /**
           *
           * 線程池執行的任務
           *
           * @author hdpan
           */

          public  class ThreadPoolTask implements Runnable, Serializable {

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

           // 保存任務所需要的數據

           private Object threadPoolTaskData;

           ThreadPoolTask(Object tasks) {

            this.threadPoolTaskData = tasks;

           }

           public void run() {

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

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

            try {

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

             Thread.sleep(consumeTaskSleepTime);

            } catch (Exception e) {

             e.printStackTrace();

            }

            threadPoolTaskData = null;

           }

           public Object getTask() {

            return this.threadPoolTaskData;

           }

          }

           


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

          2、一般來說任務除了處理方式外,還需要處理的數據,處理的數據通過構造方法傳給任務。

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

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

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

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

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

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

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

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

           

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

          java.lang.Object
          java.util.concurrent.AbstractExecutorService
          java.util.concurrent.ThreadPoolExecutor
          所 有已實現的接口:
          ExecutorExecutorService

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

          RejectedExecutionHandler handler) 的一些分析:

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

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

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

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

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

          TestDriver.java是一個驅動測試,sendMsg方法不間斷的向ThreadPoolManager發送數據。


          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和調度進程。

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

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

           // 線程池維護線程的最大數量
           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>();

           // 訪問消息緩存的調度線程
           final Runnable accessBufferThread = new Runnable()
           {
            public void run()
            {
             // 查看是否有待定請求,如果有,則創建一個新的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()+"消息放入隊列中重新等待執行");
             msgQueue.offer((( AccessDBThread ) r ).getMsg() );
            }
           };

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

           // 調度線程池
           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()
           {
            // 向數據庫中添加Msg變量值
            System.out.println("Added the message: "+msg+" into the Database");
           }

          }


           


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

          ThreadPoolManager類:負責管理線程池,調用輪詢的線程來訪問字符串緩沖區的內容,維護緩沖區,當線程池溢出時拋出的Runnable任務被加入到字符緩沖區。



          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();
          // 線程池維護線程的最少數量
          private final static int CORE_POOL_SIZE = 4;
          // 線程池維護線程的最大數量
          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();
          // 訪問消息緩存的調度線程
          final Runnable accessBufferThread = new Runnable() {
            public void run() {
             // 查看是否有待定請求,如果有,則創建一個新的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() + "消息放入隊列中重新等待執行");
             msgQueue.offer(((AccessDBThread) r).getMsg());
            }
          };
          // 管理數據庫訪問的線程池
          final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
             CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
             new ArrayBlockingQueue(WORK_QUEUE_SIZE), this.handler);
          // 調度線程池
          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() {
            // 向數據庫中添加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 閱讀(483) | 評論 (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='跳轉' /></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+")'>跳轉</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='跳轉' /></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 閱讀(1851) | 評論 (0)編輯 收藏

          1.  超級用戶相關:
          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. #查看所有數據庫
          13. show dbs
          14. #查看所有的collection
          15. show collections
          16. #查看各collection的狀態
          17. db.printCollectionStats()
          18. #查看主從復制狀態
          19. db.printReplicationInfo()
          20. #修復數據庫
          21. db.repairDatabase()
          22. #設置記錄profiling,0=off 1=slow 2=all
          23. db.setProfilingLevel(1)
          24. #查看profiling
          25. show profile
          26. #拷貝數據庫
          27. db.copyDatabase(‘mail_addr’,'mail_addr_tmp’)
          28. #刪除collection
          29. db.mail_addr.drop()
          30. #刪除當前的數據庫
          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. #存儲數組對象
          4. db.user_addr.save({‘Uid’:'yushunzhi@sohu.com’,'Al’:['test-1@sohu.com','test-2@sohu.com']})
          5. #根據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. #根據索引名刪除索引
          9. db.user_addr.dropIndex(‘Al.Em_1′)
          5. 查詢
          1. #查找所有
          2. db.foo.find()
          3. #查找一條記錄
          4. db.foo.findOne()
          5. #根據條件檢索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數據的大小
          2. db.deliver_status.dataSize()
          3. #查看colleciont狀態
          4. db.deliver_status.stats()
          5. #查詢所有索引的大小
          6. db.deliver_status.totalIndexSize()

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

          僅列出標題
          共50頁: First 上一頁 42 43 44 45 46 47 48 49 50 下一頁 
          主站蜘蛛池模板: 定日县| 疏勒县| 神池县| 儋州市| 容城县| 合江县| 克什克腾旗| 正蓝旗| 县级市| 太保市| 双鸭山市| 泸定县| 南岸区| 金昌市| 斗六市| 涿州市| 八宿县| 荥经县| 蒙山县| 青阳县| 三河市| 托里县| 古蔺县| 盘锦市| 唐山市| 钟祥市| 武威市| 信阳市| 漾濞| 文成县| 北海市| 长武县| 肥乡县| 望江县| 大冶市| 开远市| 安塞县| 都江堰市| 雷波县| 利川市| 湖南省|