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
        }
    }
    
    
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题

现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下。如果你也碰到了同样的问...

1.1K10
来自专栏Android中高级开发

Android并发编程 多线程与锁

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的。

12160
来自专栏Lambda

Java并发编程

前奏 1、多线程一定比单线程快吗? 比如一个炉子烤烧饼,一次烤一个快还是轮询烤快? 一次烤多个在切换时就会浪费炉火,所有不一定多个快。 但多个炉火轮询这就...

38460
来自专栏拭心的安卓进阶之路

并发编程1:全面认识 Thread

线程简介 现在操作系统在运行一个程序时,会自动为其创建一个进程,不论是 PC 还是 Android。 一个进程内可以有多个线程,这些线程作为操作系统调度的最小单...

21680
来自专栏Java帮帮-微信公众号-技术文章全总结

Java多线程详解4【面试+工作】​

Java多线程详解【面试+工作】 Java线程:并发协作-死锁 线程发生死锁可能性很小,即使看似可能发生死锁的代码,在运行时发生死锁的可能性也是小之又小。 发生...

35990
来自专栏高爽的专栏

Java线程(四):线程中断、线程让步、线程睡眠、线程合并

最近在Review线程专栏,修改了诸多之前描述不够严谨的地方,凡是带有Review标记的文章都是修改过了。本篇文章是插进来的,因为原来没有写,现在...

27300
来自专栏Ken的杂谈

WCF常见问题及解决办法

一、问题:这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致

14920
来自专栏拭心的安卓进阶之路

并发编程1:全面认识 Thread

线程简介 现在操作系统在运行一个程序时,会自动为其创建一个进程,不论是 PC 还是 Android。 一个进程内可以有多个线程,这些线程作为操作系统调度的最小单...

23250
来自专栏用户2442861的专栏

《Java编程思想》学习笔记18——并发编程(一)

http://blog.csdn.net/chjttony/article/details/7039602

7910
来自专栏程序员宝库

【译】深入研究 Laravel 的依赖注入容器

原文地址:Laravel's Dependency Injection Container in Depth 下面是中文翻译。 Laravel拥有强大的控制反转...

62770

扫码关注云+社区

领取腾讯云代金券