
1.包含队列弹出的线程池管理类

WorkItem：某一个工作项的线程封装类。主要用来将 工作状态、线程、结果、是否完成、回调函数进行封装。

SingleThreadRunner: 某一个任务、对应的线程池的包装类。
 对单个线程池和单个任务工作项进行包装。负责判断是否执行下一个、挂载回调函数等。

ThreadPool： 是总的"管理类"(负责管理多个不同的任务类型、同时执行)。
也是对入栈、出栈、总线程数、等待线程数满、下一个自动开线程执行、停止、销毁等操作的集合类。 


概述：

多个线程公用同一个队列。
配置几个线程数，就有几个SingleThreadRunner对象。
多个SingleThreadRunner对象之间从---队列中争抢资源 由ThreadPool的队列控制管理。
 ----------------------------------等待线程空闲，由SingleThreadRunner对象自己管理。


--------说明1：
SingleThreadRunner
与
ThreadPool

相互引用关系。
ThreadPool管理多个SingleThreadRunner。

SingleThreadRunner在ThreadPool中传参， 内部调用ThreadPool的入、出、停止等方法。

--------说明2：
虽然类似Parallels，但和Parallels不同
解决问题：

你可以将不同的工作内容T放在一个单一的线程池。（而不是只有一个对象类型Parallels<T>,T只能是一个）,
作为一个程序核心不需要关心 每个功能分别需要多少参数和返回值。
你可以一次（把不同的）全部加进来，也可以每一个（不同的）作为一个工作项加入进来。

------说明3：
CPU核心数与线程数的关系：

AMD的CPU几核就是几核。
Intel的CPU ，它采用超线程技术，单核的通过超线程技术可以显示为双核，双核的显示为4核。

但是因为线程切换技术，所以一个CPU带10个、100个、1000个线程都不是问题。 

所以CPU核心数*几，要根据性能来看。

///从唯一一个队列中读数据，最快的方式就是速度执行，但是存在卡住一个，其他的也没办法继续执行的问题。
///使用多线程的意义，在于不被全锁。在每个项目、每个线程意义上自旋。而不是整个全部锁。
///线程并不能提高速度，而是在执行某个耗时的功能时，在还可以做其它的事。多线程使你的程序在处理文件时不必显得已经卡死。