public WorkManager(WorkType workType) {

        pipeManager = new PipeManager<WorkEntry<? extends Work>>();
        pipeManager.init(workType);
        this.workType = workType;

        List<Pipe<WorkEntry<? extends Work>>> pipes = pipeManager.getAvailablePipes(workType);

        m_threadPool = Executors.newFixedThreadPool(pipes.size() * workType.getWorkerPipeRatio());

        Worker worker = null;
        for (Pipe<WorkEntry<? extends Work>> pipe : pipes) {
            for (int i = 0; i < workType.getWorkerPipeRatio(); ++i) {
                if (root == null) {
                    root = worker = new SimpleWorker<WorkEntry<? extends Work>>(pipe.getReadyWorkQueue(), workType, SimpleWorker.class.getSimpleName() + " {" + i + "}");
                    m_threadPool.execute(worker);
                } else {
                    Worker tmpWorker = worker;
                    worker = new SimpleWorker<WorkEntry<? extends Work>>(pipe.getReadyWorkQueue(), workType, SimpleWorker.class.getSimpleName() + " {" + i + "}");
                    assert ((SimpleWorker) tmpWorker) != null;
                    ((SimpleWorker) tmpWorker).setNextWorker(worker);
                    ((SimpleWorker) worker).setPreviousWorker(tmpWorker);

                    m_threadPool.execute(worker);
                }


            }
        }

        isInitialization = true;

        if (needProfiling()) {
            MonitorThread thread = new MonitorThread();
            thread.setDaemon(true);
            thread.start();
        }
    }