ThreadDebugger, 线程监视器和线程池工厂

分享于 

24分钟阅读

GitHub

  繁體 雙語
Threads monitor and the thread pool factory.
  • 源代码名称:ThreadDebugger
  • 源代码网址:http://www.github.com/Jacksgong/ThreadDebugger
  • ThreadDebugger源代码文档
  • ThreadDebugger源代码下载
  • Git URL:
    git://www.github.com/Jacksgong/ThreadDebugger.git
    Git Clone代码到本地:
    git clone http://www.github.com/Jacksgong/ThreadDebugger
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/Jacksgong/ThreadDebugger
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    ThreadDebugger

    ThreadDebuggerThreadPoolsBuild Status

    自述文件 | 中文文档

    这里Github包括:线程调试器( threaddebugger ) 、Thread factory(threadpools)。

    线程调试器

    在应用程序中调试线程的方法有几种,比如通过使用运行线程的方式跟踪跟踪,或者通过在Android设备监视器中记录运行线程信息,有些情况下是太重,有时不是灵活的。

    使用这个 ThreadDebugger,你不用担心记录多长时间,你可以发现线程的变化非常简单。

    线程池工厂

    这个线程池工厂的执行者要求每个任务提供它的确切名称以方便调试,并且在公共规则中创建一些线程池非常方便。

    安装

    ThreadDebugger和ThreadPool是通过向 build.gradle file: 添加以下依赖项安装

    dependencies {
     // If you need use ThreadDebugger. debugCompile 'cn.dreamtobe.threaddebugger:threaddebugger:1.5.2' releaseCompile 'cn.dreamtobe.threaddebugger:threaddebugger-no-op:1.5.2'// If you need use ThreadPool. compile 'cn.dreamtobe.threaddebugger:threadpool:1.5.2'}
    • ThreadDebugger: Download
    • ThreadDebugger-no-op: Download
    • 线程池:Download

    II。启动监视器

    IThreadDebugger debugger =ThreadDebugger.install(
     ThreadDebuggers.createWithCommonThreadKey() /** The ThreadDebugger with known thread Categories **/// add Thread Category. add("IO", "IO")
    . add("computation", "computation")
    . add("network", "network")
    . add("test1", "test1")
    . add("test2", "test2")
    . add("test3", "test3")
    . add("test4", "test4"),
     2000, /** The frequent of Updating Thread Activity information **/newThreadDebugger.ThreadChangedCallback() { /** The threads changed callback **/@OverridepublicvoidonChanged(IThreadDebuggerdebugger) {
     // callback this method when the threads in this application has changed.Log.d(TAG, debugger.drawUpEachThreadInfoDiff());
     Log.d(TAG, debugger.drawUpEachThreadSizeDiff());
     Log.d(TAG, debugger.drawUpEachThreadSize());
     Log.d(TAG, debugger.drawUpEachThreadInfo());
     Log.d(TAG, debugger.drawUpUnknownInfo());
     }
     });

    III输出电容

    如果时间是你的考虑,请使用 adb logcat -v time 代替 adb logcat -v raw 波形命令。

    1.drawUpEachThreadInfoDiff

    adb logcat -v raw | grep drawUpEachThreadInfoDiff:

    
    drawUpEachThreadInfoDiff: Thread count = 13. Thread differ : +13. main: +1 [(+)main] | Binder: +2 [(+)Binder_2, (+)Binder_1] | Finalizer: +2 [(+)FinalizerWatchdogDaemon, (+)FinalizerDaemon] | RenderThread: +1 [(+)RenderThread] | HeapTaskDaemon: +1 [(+)HeapTaskDaemon] | ReferenceQueueDaemon: +1 [(+)ReferenceQueueDaemon] | JDWP: +1 [(+)JDWP] | unknown: +4 [(+)hwuiTask1, (+)hwuiTask2, (+)ThreadDebugger, (+)Signal Catcher]
    
    
    drawUpEachThreadInfoDiff: Thread count = 15. Thread differ : +2. computation: +1 [(+)computation-1::running-Test1:7s] | test1: +1 [(+)test1-ExceedDiscard-1::running-RandomThreadWork]
    
    
    drawUpEachThreadInfoDiff: Thread count = 16. Thread differ : +1. test1: +1 [(+)test1-ExceedDiscard-2::running-Test2:1s]
    
    
    drawUpEachThreadInfoDiff: Thread count = 17. Thread differ : +1. computation: +1 [(+)computation-2::running-Test3:8s] | test1: SWAP [(+)test1-ExceedDiscard-2::idle, (-)test1-ExceedDiscard-2::running-Test2:1s]
    
    
    drawUpEachThreadInfoDiff: Thread count = 17. Thread differ : 0. computation: SWAP [(+)computation-1::idle, (-)computation-1::running-Test1:7s]
    
    
    drawUpEachThreadInfoDiff: Thread count = 18. Thread differ : +1. computation: +1 [(+)computation-3::running-Test4:9s]
    
    
    drawUpEachThreadInfoDiff: Thread count = 19. Thread differ : +1. network: +1 [(+)network-1::running-Test5:1s]
    
    
    drawUpEachThreadInfoDiff: Thread count = 19. Thread differ : 0. network: SWAP [(+)network-1::idle, (-)network-1::running-Test5:1s]
    
    
    drawUpEachThreadInfoDiff: Thread count = 20. Thread differ : +1. IO: +1 [(+)io-1::running-Test6:1s]
    
    
    drawUpEachThreadInfoDiff: Thread count = 20. Thread differ : 0. IO: SWAP [(+)io-1::idle, (-)io-1::running-Test6:1s]
    
    
    drawUpEachThreadInfoDiff: Thread count = 20. Thread differ : 0. computation: SWAP [(+)computation-2::idle, (-)computation-2::running-Test3:8s] | test1: SWAP [(+)test1-ExceedDiscard-1::idle, (-)test1-ExceedDiscard-1::running-RandomThreadWork]
    
    
    drawUpEachThreadInfoDiff: Thread count = 20. Thread differ : 0. computation: SWAP [(+)computation-3::idle, (-)computation-3::running-Test4:9s]
    
    
    
    
    2.drawUpEachThreadSizeDiff

    adb logcat -v raw | grep drawUpEachThreadSizeDiff:

    
    drawUpEachThreadSizeDiff: Thread count = 13. Thread differ : +13. main: +1 | Binder: +2 | Finalizer: +2 | RenderThread: +1 | HeapTaskDaemon: +1 | ReferenceQueueDaemon: +1 | JDWP: +1 | unknown: +4 [(+)hwuiTask1, (+)hwuiTask2, (+)ThreadDebugger, (+)Signal Catcher]
    
    
    drawUpEachThreadSizeDiff: Thread count = 15. Thread differ : +2. computation: +1 | test1: +1
    
    
    drawUpEachThreadSizeDiff: Thread count = 16. Thread differ : +1. test1: +1
    
    
    drawUpEachThreadSizeDiff: Thread count = 17. Thread differ : +1. computation: +1
    
    
    drawUpEachThreadSizeDiff: Thread count = 17. Thread size has not changed.
    
    
    drawUpEachThreadSizeDiff: Thread count = 18. Thread differ : +1. computation: +1
    
    
    drawUpEachThreadSizeDiff: Thread count = 19. Thread differ : +1. network: +1
    
    
    drawUpEachThreadSizeDiff: Thread count = 19. Thread size has not changed.
    
    
    drawUpEachThreadSizeDiff: Thread count = 20. Thread differ : +1. IO: +1
    
    
    drawUpEachThreadSizeDiff: Thread count = 20. Thread size has not changed.
    
    
    drawUpEachThreadSizeDiff: Thread count = 20. Thread size has not changed.
    
    
    drawUpEachThreadSizeDiff: Thread count = 20. Thread size has not changed.
    
    
    
    
    3。drawUpEachThreadSize

    adb logcat -v raw | grep drawUpEachThreadSize:

    
    drawUpEachThreadSize: Thread count = 13. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 15. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 1 | test1: 1 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 16. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 1 | test1: 2 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 17. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 2 | test1: 2 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 17. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 2 | test1: 2 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 18. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 3 | test1: 2 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 19. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 19. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 20. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | IO: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 20. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | IO: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 20. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | IO: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
    
    
    drawUpEachThreadSize: Thread count = 20. main: 1 | Binder: 2 | Finalizer: 2 | RenderThread: 1 | HeapTaskDaemon: 1 | ReferenceQueueDaemon: 1 | JDWP: 1 | IO: 1 | computation: 3 | network: 1 | test1: 2 | unknown: 4
    
    
    
    
    4.drawUpEachThreadInfo

    adb logcat -v raw | grep drawUpEachThreadInfo:

    
    drawUpEachThreadInfo: Thread count = 13. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerWatchdogDaemon, FinalizerDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | unknown[hwuiTask1, hwuiTask2, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 15. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::running-Test1:7s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 16. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::running-Test1:7s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::running-Test2:1s] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 17. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::running-Test1:7s, computation-2::running-Test3:8s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 17. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::idle, computation-2::running-Test3:8s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 18. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 19. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | network[network-1::running-Test5:1s] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 19. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | network[network-1::idle] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 20. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | IO[io-1::running-Test6:1s] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | network[network-1::idle] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 20. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | IO[io-1::idle] | computation[computation-1::idle, computation-2::running-Test3:8s, computation-3::running-Test4:9s] | network[network-1::idle] | test1[test1-ExceedDiscard-1::running-RandomThreadWork, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 20. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | IO[io-1::idle] | computation[computation-1::idle, computation-2::idle, computation-3::running-Test4:9s] | network[network-1::idle] | test1[test1-ExceedDiscard-1::idle, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpEachThreadInfo: Thread count = 20. main[main] | Binder[Binder_2, Binder_1] | Finalizer[FinalizerDaemon, FinalizerWatchdogDaemon] | RenderThread[RenderThread] | HeapTaskDaemon[HeapTaskDaemon] | ReferenceQueueDaemon[ReferenceQueueDaemon] | JDWP[JDWP] | IO[io-1::idle] | computation[computation-1::idle, computation-2::idle, computation-3::idle] | network[network-1::idle] | test1[test1-ExceedDiscard-1::idle, test1-ExceedDiscard-2::idle] | unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    
    
    5.drawUpUnknownInfo

    adb logcat -v raw | grep drawUpUnknownInfo:

    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = +4. unknown[hwuiTask1, hwuiTask2, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    drawUpUnknownInfo: Unknow thread count = 4. Unknow thread differ = 0. unknown[hwuiTask2, hwuiTask1, ThreadDebugger, Signal Catcher]
    
    
    
    

    IThreadDebugger中的 IV

    方法函数
    添加( 键:字符串)添加线程类别,用于比较线程名称的起始点,也将它的作为调试器的别名。
    添加( startwithkey: 字符串,alias:String )将带有startWithKey及其别名的线程类别添加到调试器中。
    刷新( )刷新线程情况。
    drawUpEachThreadSize ( )每个线程的大小的内容。
    drawUpEachThreadInfo ( )每个线程的信息的内容。
    drawUpEachThreadSizeDiff ( )更改的每个线程的更改大小的内容。
    drawUpEachThreadInfoDiff ( )每个已经更改线程的信息的内容。
    drawUpUnknownInfo ( )未知线程信息的内容。
    isSizeChanged ( )线程的大小是否已经更改。
    isChanged ( )线程是否已经更改。

    ThreadPools

    这个线程池工厂的执行者将要求它中的每个任务提供它的确切名称以便调试。

    1基本规则

    新任务在方法2 中提交,并且少于线程运行时,创建一个新线程来处理请求,即使其他工作线程处于空闲状态时也是如此。 在线程运行的时候,如果超过 corePoolSize,那么就会创建一个新线程来处理请求,但是当它变成空闲的时候,等待新任务的时间超过,它将终止资源的成本。

    2 ThreadPools方法函数中的方法
    newExceedWaitPool如果在满足基本规则的前提下,在运行 maximumPoolSize 任务时,将在等待队列中排队,并在运行任务小于 maximumPoolSize 时执行。
    newExceedDiscardPool在满足基本规则的前提下,如果有 maximumPoolSize 任务运行,则会放弃进一步任务。
    newExceedCallerRunsPool在满足基本规则的前提下,如果有 maximumPoolSize 任务运行,将在调用者线程中立即执行任务。
    newExceedCallImmediatelyPool如果在满足基本规则的前提下,在运行 maximumPoolSize 任务时,将在全局临时未绑定线程池中立即执行任务。
    newSinglePool这里相同 java.util.concurrent.Executors#newSingleThreadExecutor()
    newFixedPool这里相同 java.util.concurrent.Executors#newFixedThreadPool(int)
    newCachedPool这里相同 java.util.concurrent.Executors#newCachedThreadPool()
    newNoCorePool如果有 threadCount 任务运行,则进一步任务将被排队到等待队列,并且在运行任务小于 threadCount 时执行。 如果这个池中的线程空闲,等待新任务的间隔时间更多,那么将终止以降低资源消耗。

    演示项目

    。许可证

    
    Copyright (C) 2015-2016 Jacksgong(blog.dreamtobe.cn)
    
    
    
    Licensed under the Apache License, Version 2.0 (the"License");
    
    
    you may not use this file except in compliance with the License.
    
    
    You may obtain a copy of the License at
    
    
    
     http://www.apache.org/licenses/LICENSE-2.0
    
    
    
    Unless required by applicable law or agreed to in writing, software
    
    
    distributed under the License is distributed on an"AS IS" BASIS,
    
    
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    
    
    See the License for the specific language governing permissions and
    
    
    limitations under the License.
    
    
    
    

    监视器  Monit  FACT  thread  Factory  POOL  
    相关文章