• Java 线程池的实现


    线程池的实现

       组成

        一个比较简单的线程池至少应包括

            线程池管理器:创建、销毁并管理线程池,将工作线程放入线程池中;

            工作线程:一个可以循环执行任务的线程,在没有任务时进行等待;

            任务队列:提供一种缓冲机制,将没有处理的任务放在任务队列中;

            任务接口:每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等。 工作线程通过该接口调度任务的执行。

       原理

       类似于操作系统中的缓冲区,流程如下:

       先启动若干数量的线程,并让这些线程都处于等待状态,当客户端有一个新请求时,就会唤醒线程池中的某一个等待线程,让他来处理客户端的这个请求,当处理完后,继续处于等待状态。

    代码实现

       ThreadPoolManager类: 管理线程池,初始化线程池,并为客户端请求分配不同的线程来处理;

       SimpleThread类:Thread类的一个子类,对客户端请求进行处理的类,初始化时均为睡眠状态,若接收到ThreadPoolManager的调度,则会唤醒线程。

    package thread;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.*;
    
    
    public class threadpool {
            
        static class ThreadPoolManager{
                private int MaxThread;
                private Vector ThreadQueue;
                
                public void setMaxThread(int count){
                    this.MaxThread=count;
                }
                
                public ThreadPoolManager(int count){
                    setMaxThread(count);
                    System.out.println("Starting Thread Pool");
                    ThreadQueue=new Vector();
                    for(int i=0;i<=MaxThread;i++){
                        SimpleThread thread=new SimpleThread(i);
                        ThreadQueue.addElement(thread);
                        thread.start();
                    }
                }
                
                public void process(String argument){
                    int i;
                    for(i=0;i<ThreadQueue.size();i++){
                        SimpleThread current=(SimpleThread) ThreadQueue.elementAt(i);
                        if(!current.isRunning()){
                            System.out.println("Thread"+(i+1)+"is processing:"+argument);
                            current.setArgument(argument);
                            current.setRunning(true);
                            return;
                        }
                    }
                    
                    if(i==ThreadQueue.size()){
                        System.out.println("pool is full,try in anthor time");
                    }
                }
                
        }
        
        
        static class SimpleThread extends Thread{
            private boolean RunningFlag;
            private String argument;
            public boolean isRunning(){
                return RunningFlag;
            }
            
            public synchronized void setRunning(Boolean Flag){
                RunningFlag=Flag;
                if(Flag){
                    this.notify();
                }
            }
            
            public String getArgument(){
                return this.argument;
            }
            
            public void setArgument(String string){
                argument=string;
            }
            
            public SimpleThread(int threadNumber){
                RunningFlag=false;
                System.out.println("thread"+threadNumber+"started.");
            }
            
            public synchronized void run(){
                try {
                    while(true){
                        if(!RunningFlag){
                            this.wait();
                        }
                        else{
                            System.out.println("process"+getArgument()+"……done!");
                            sleep(5000);
                            System.out.println("Thread is sleeping.");
                            setRunning(false);
                            
                        }
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                    System.out.println("Interrupt");
                }
            }
        }
        
        public static void main(String[] args) {
            try {
                BufferedReader brBufferedReader=new BufferedReader(new InputStreamReader(System.in));
                String string;
                ThreadPoolManager manager=new ThreadPoolManager(10);
                while((string=brBufferedReader.readLine())!=null){
                    manager.process(string);
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
        
        
    }

       

       

    作者:Rekent
    出处:http://www.cnblogs.com/rekent/
    本文版权归作者和博客园共有,欢迎转载、点赞,但未经作者同意必须保留此段申明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    微软SQL Server 2005的30项顶尖特性
    UML统一建模语言 类关系
    设计模式 建造者模式
    设计模式 原型模式
    设计模式 简单工厂模式
    设计模式 适配器模式
    设计模式 适配器模式
    设计模式 单例模式
    设计模式 抽象工厂模式
    设计模式 桥接模式
  • 原文地址:https://www.cnblogs.com/rekent/p/6918043.html
Copyright © 2020-2023  润新知